15

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を作成する方法、またはこのコンテキストで機能する可能性のあるその他のものを作成する方法です。

4

2 に答える 2

23

最後に答えを見つけました。

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()
于 2009-08-05T11:07:11.410 に答える
7

Python 3を使用している場合は、 1 つの調整が必要です。「r」を「rb」に変更します。

f = File(open(os.path.join(IMPORT_DIR, 'fotos', photo), 'rb'))
于 2014-07-11T13:45:43.367 に答える