从Django shell上传文件
我需要从一个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()