从Django sh“上传”文件

2024-10-06 11:19:24 发布

您现在位置:Python中文网/ 问答频道 /正文

我需要从一个excel文件和一个包含图像的文件夹中导入一些数据,excel中的每一行都描述了每个条目,并且在文件夹中有一个文件名列表(与条目相关的照片)。

我已经完成了一个脚本,它创建了数据库中的每个条目,并通过django shell保存它,但是我不知道如何实例化InMemoryUploadedFile来与模型一起保存它。

在django 1.0中,我有一个小类,它允许我做我需要的事情,但是随着django1.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?,或者任何其他可以在这种情况下工作的东西。


Tags: pathdjango实例name图像self文件夹size
2条回答

我终于找到了答案。

from django.core.files import File

f = File(open(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 3,则需要进行一次调整-将“r”更改为“rb”:

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

相关问题 更多 >