2009-08-05 14 views
11

エクセルファイルと画像付きのフォルダからいくつかのデータをインポートする必要があります。エクセルのすべての行はすべてのエントリを記述し、フォルダ内のファイル名のリストを持っています)。djangoシェルからファイルをアップロードする

データベースのすべてのエントリを作成し、それを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を作成するのですか、です。

答えて

18

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

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

をですから、Fileオブジェクトを作成するにImportFileオブジェクトを作るから変わったのか? ImportFileはFileではなくFileから派生しましたか? ImportFileをFileから派生させることでこれを修正できたようですが、ImportFileが何を式に追加しているのか分かりません。提示されたコードから、多くの特殊な振る舞いをしているようには見えなかった。 – hughdbrown

+0

まず、ファイルオブジェクトを操作しようとしたときに、djangoは "fが属性チャンクを持たない"ようないくつかの例外を発生させたので、このクラスを作成して作業に必要なすべての属性を書き出しました。 – hchinchilla

4

Pythonの3を1つずつ使用して調整が必要な場合 - 'RB' への変更は 'r':

f = File(open(os.path.join(IMPORT_DIR, 'fotos', photo), 'rb')) 
関連する問題