从Django shell上传文件

16 投票
2 回答
9572 浏览
提问于 2025-04-15 13:23

我需要从一个Excel文件和一个包含图片的文件夹中导入一些数据,Excel中的每一行都描述了一个条目,并且有一个文件名的列表,这些文件名对应文件夹中的照片。

我写了一个脚本,可以在数据库中创建每个条目,并通过django的命令行保存它,但我不知道怎么创建一个InMemoryUploadedFile,以便用模型保存它。

在django 1.0时,我有一个小类可以让我完成这个需求,但在django 1.1中发生了变化,它就不再工作了。

class ImportFile(file):
    def __init__(self, *args, **kwargs):
        super(ImportFile, self).__init__(*args, **kwargs)
        self._file = self
        self.size = os.path.getsize(self.name)

    def __len__(self):
        return self.size

    def chunks(self, chunk_size=None):
        self._file.seek(0)
        yield self.read()

我用这个类和一段代码来加载图片,并将它们与模型实例一起保存。

for photo in photos:
    f = ImportFile(os.path.join(IMPORT_DIR, 'fotos', photo), 'r')
    p = Photo(name=f.name, image=f, parent=supply.supply_ptr)
    name = str(uuid1()) + os.path.splitext(f.name)[1]
    p.image.save(name, f)
    p.save()

我的问题是,如何在Python中从一个文件创建InMemoryUploadedFile或TemporaryUploadedFile?或者有没有其他方法可以在这个情况下使用。

2 个回答

7

如果你使用的是Python 3,需要做一个调整 - 把'r'改成'rb':

f = File(open(os.path.join(IMPORT_DIR, 'fotos', photo), 'rb'))
24

最后我找到了答案。

from django.core.files import File

f = File(open(os.path.join(IMPORT_DIR, 'fotos', photo), 'rb'))
p = Photo(name=f.name, image=f, parent=supply.supply_ptr)
name = str(uuid1()) + os.path.splitext(f.name)[1]
p.image.save(name, f)
p.save()

撰写回答