将Django的FileField设置为现有文件
我在电脑上有一个现成的文件(比如说在 /folder/file.txt),而在Django里有一个叫做FileField的模型字段。
当我执行
instance.field = File(file('/folder/file.txt'))
instance.save()
时,它会把这个文件重新保存为 file_1.txt
(下次会变成 _2
,以此类推)。
我明白这样做的原因,但我不想要这个效果——我知道我想要的文件已经在那里等着我了,我只想让Django指向这个文件。
那该怎么做呢?
7 个回答
24
试试这个(可以参考这个文档):
instance.field.name = <PATH RELATIVE TO MEDIA_ROOT>
instance.save()
158
只需要把 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>
25
如果你想要永久性地实现这个功能,你需要创建一个自己的文件存储类。
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)