Django의 FileField를 기존 파일로 설정
디스크에 기존 파일 (예 : /folder/file.txt)과 Django에 FileField 모델 필드가 있습니다.
내가 할 때
instance.field = File(file('/folder/file.txt'))
instance.save()
파일을 file_1.txt
(다음 번 _2
에 등) 으로 다시 저장합니다 .
이유는 이해하지만이 동작은 원하지 않습니다. 필드와 연결하려는 파일이 실제로 나를 기다리고 있다는 것을 알고 있으며 Django가이를 가리 키기를 원합니다.
어떻게?
이 작업을 영구적으로 수행하려면 고유 한 FileStorage 클래스를 만들어야합니다.
import os
from django.conf import settings
from django.core.files.storage import FileSystemStorage
class MyFileStorage(FileSystemStorage):
# This method is actually defined in Storage
def get_available_name(self, name):
if self.exists(name):
os.remove(os.path.join(settings.MEDIA_ROOT, name))
return name # simply returns the name passed
이제 모델에서 수정 된 MyFileStorage를 사용합니다.
from mystuff.customs import MyFileStorage
mfs = MyFileStorage()
class SomeModel(model.Model):
my_file = model.FileField(storage=mfs)
instance.field.name
파일 경로로 설정 하기 만하면 됩니다.
예 :
class Document(models.Model):
file = FileField(upload_to=get_document_path)
description = CharField(max_length=100)
doc = Document()
doc.file.name = 'path/to/file' # must be relative to MEDIA_ROOT
doc.file
<FieldFile: path/to/file>
이것을 시도하십시오 ( doc ) :
instance.field.name = <PATH RELATIVE TO MEDIA_ROOT>
instance.save()
자신의 스토리지 클래스를 작성하는 것이 옳습니다. 그러나 get_available_name
재정의하는 올바른 방법이 아닙니다.
get_available_name
Django가 동일한 이름의 파일을보고 사용 가능한 새 파일 이름을 얻으려고 할 때 호출됩니다. 이름을 바꾸는 것은 방법이 아닙니다. 그 원인은 _save
. 의 주석은 _save
꽤 좋으며 os.O_EXCL
동일한 파일 이름이 이미 존재하면 OSError를 발생시키는 플래그로 작성하기 위해 파일을 쉽게 열 수 있습니다 . Django는이 오류를 포착 한 다음 호출 get_available_name
하여 새 이름을 얻습니다.
그래서 올바른 방법은 _save
flag없이 os.open () 을 재정의 하고 호출하는 것 os.O_EXCL
입니다. 수정은 매우 간단하지만 방법이 조금 길어서 여기에 붙여 넣지 않습니다. 더 많은 도움이 필요하면 알려주세요 :)
나는 똑같은 문제가 있었다! 그런 다음 내 모델이 그 원인을 알았습니다. 예를 들어 다음과 같은 모델을 사용했습니다.
class Tile(models.Model):
image = models.ImageField()
그런 다음 디스크의 동일한 파일을 참조하는 하나의 타일을 더 많이 갖고 싶었습니다! 그것을 해결하기 위해 찾은 방법은 모델 구조를 다음과 같이 변경하는 것입니다.
class Tile(models.Model):
image = models.ForeignKey(TileImage)
class TileImage(models.Model):
image = models.ImageField()
같은 파일을 DB에 더 많이 저장하려면 다른 테이블을 만들어야하기 때문입니다.
모델을 변경할 수 있기를 바라면서도 그렇게 문제를 해결할 수 있다고 생각합니다!
편집하다
또한 다음과 같은 다른 저장소를 사용할 수 있다고 생각합니다. SymlinkOrCopyStorage
http://code.welldev.org/django-storages/src/11bef0c2a410/storages/backends/symlinkorcopy.py
참고 URL : https://stackoverflow.com/questions/8332443/set-djangos-filefield-to-an-existing-file
'code' 카테고리의 다른 글
제약 조건을 변경하는 방법 (0) | 2020.10.10 |
---|---|
대용량 어레이 스토리지 (플랫 바이너리 파일 대신)에 HDF5를 사용하면 분석 속도 또는 메모리 사용 이점이 있습니까? (0) | 2020.10.10 |
코드가 꼬리 호출 최적화를 적극적으로 방지하려는 이유는 무엇입니까? (0) | 2020.10.10 |
Eclipse를 Indigo에서 Juno로 업그레이드하는 설정을 유지할 수 있습니까? (0) | 2020.10.10 |
자바 스크립트에서 'throw'후에 'return'이 필요합니까? (0) | 2020.10.10 |