2009-05-11 11 views
5

Pythonで生成された大きなデータセットをDjangoモデルに保存したいと思います。私の考えは、データを文字列にピックルし、それを私のモデルのFileFieldにアップロードすることでした。私のDjangoのモデルがある:私のPythonプログラムでpickleされたデータをdjango FileFieldにアップロードするにはどうすればいいですか?

#models.py 
from django.db import models 

class Data(models.Model): 
    label = models.CharField(max_length=30) 
    file = models.FileField(upload_to="data") 

私は次の操作を実行したいと思います:

import random, pickle 

data_entry = Data(label="somedata") 
somedata = [random.random() for i in range(10000)] 
# Next line does NOT work 
#data_entry.file.save(filename, pickle.dumps(somedata)) 

どのように私はupload_toパラメータで定義されたパスを保存filesomedataを格納するための最後の行を変更する必要があります?

+0

ちょうど私達がはっきりしています:あなたはどんな*ユーザーにもピクルスをアップロードさせることを話しているわけではありませんか?それは極端に危険なことでしょう、 –

+0

いいえ、まったくありません。この考え方は、サーバー上にデータを生成してデータベースに追加することです。ユーザーは、データを生成するために使用されるモデルのパラメータ(上記の例で乱数の範囲など)を変更することのみが許可されます。この意味では、実際の "アップロード"ではありませんが、とにかく私はdjangoに(新しいディレクトリを作成し、重複を避けるなど)パスを管理したいと思います。 – btel

答えて

-2

注:は他の回答と以下のコメントを参照してください - 古い情報や削除壊れたリンクを(一度受け入れ答えを削除することはできません)。

Marty Alchinは、Pro Djangoの第3章で、review hereというセクションを持っています。

+0

私が間違っていない限り、本はもはや無料で利用できるように見えます。 – DanH

+0

これは単なるセクションでした。 amazon.comのプレビューがあります。もしあなたが本当に自分のハードワークのためにMartyに支払うことを望まないなら、http://www.ittelkom.ac.id/staf/kms/TOT%20Phython/Pro_Django.pdf –

+0

これはサイトは昇進ではない回答です。この答えは役に立たない。 –

0

テキストフィールドにデータを保存する方がよいでしょうか?結局のところ、ファイルのアップロードではありません。

+2

データが非常に大きいので、データベースに保存したくない場合があります。 – btel

1

データベースでは、ファイル属性はファイルへの単なるパスです。したがって、実際のアップロードを行っていないので、ファイルをディスクに保存し、パスをデータベースに保存する必要があります。

f = open(filename, 'w') 
pickle.dump(somedata, f) 
f.close() 
data_entry.file=filename 
data_entry.save() 
+0

答えをありがとう!問題は、まだFileFieldを使用してパスを生成し、ディレクトリを作成することです。 – btel

0

私はこれをやったことがないが、関連するコードのビットを読み出すに基づいて、私はdjango.core.files.base.ContentFileのインスタンスを作成するに見て、そのように割り当てることにより、起動したいですフィールドの値。

9

私は、次の解決策を考え出した質問への回答に基づいて:

from django.core.files.base import ContentFile 
import pickle 

content = pickle.dumps(somedata) 
fid = ContentFile(content) 
data_entry.file.save(filename, fid) 
fid.close() 

それはすべてサーバ側で実行され、ユーザーは漬物をアップロードすることが許可されていません。私はそれをテストし、それはすべて正常に動作しますが、私は任意の提案に開放されています。

+0

これは私が推薦したものです –