【问题标题】:"Upload" a file from django shell从 django shell“上传”一个文件
【发布时间】:2010-11-16 23:23:41
【问题描述】:

我需要从一个 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()

我在这段代码中使用这个类来加载图像并将它们与模型实例一起保存。

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?,或任何其他可以在这种情况下工作的东西。

【问题讨论】:

    标签: python django file import data-importer


    【解决方案1】:

    我终于找到了答案。

    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()
    

    【讨论】:

    • 所以您从制作 ImportFile 对象更改为制作 File 对象? ImportFile 是从文件派生的,而不是文件?听起来您可以通过从 File 派生 ImportFile 来解决此问题,但是我不确定 ImportFile 将什么添加到等式中。从提供的代码来看,它似乎没有很多专门的行为。
    • 首先,当我尝试使用文件对象时,django 引发了一些异常,例如“f 没有属性块”,所以我创建了这个类并编写了工作所需的所有属性。
    【解决方案2】:

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

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

    【讨论】:

      猜你喜欢
      • 2014-08-31
      • 2012-07-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多