从django shell"上传"文件

hch*_*lla 15 python django import file data-importer

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

我已经完成了一个脚本,它创建数据库中的每个条目并通过django shell保存它,但我不知道如何实例化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()
Run Code Online (Sandbox Code Playgroud)

我正在使用这个代码来加载图像并使用模型实例保存它们.

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()
Run Code Online (Sandbox Code Playgroud)

问题是,如何从python中的文件创建InMemoryUploadedFile或TemporaryUploadedFile,或者在此上下文中可以工作的任何其他东西.

hch*_*lla 22

最后我找到了答案.

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()
Run Code Online (Sandbox Code Playgroud)


Ste*_*eve 6

如果使用Python 3需要进行一项调整 - 将“r”更改为“rb”:

f = File(open(os.path.join(IMPORT_DIR, 'fotos', photo), 'rb'))
Run Code Online (Sandbox Code Playgroud)