将Django的FileField设置为现有文件

112 投票
7 回答
53604 浏览
提问于 2025-04-17 07:25

我在电脑上有一个现成的文件(比如说在 /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)

撰写回答