質問

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

役に立ちましたか?

解決

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

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 を使用する場合、1つの調整が必要です-「r」を「rb」に変更します。

f = File(open(os.path.join(IMPORT_DIR, 'fotos', photo), 'rb'))
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top