なぜ私は「FileFieldに」オブジェクトには属性「プット」を持っていないになっていますか?

StackOverflow https://stackoverflow.com/questions/4219955

質問

http://mongoengine.org/docs/v0.4/guide後mongoengine FileFieldにIについて/gridfs.html のマニュアルは、次のでした。

私のモデルでは、

files = ListField(FileField())

私のテストコードでは、

    # Create an entry 
    photo = FileField()
    f  = open('/home/foo/marmot.jpg', 'r')   
    photo.put(f, content_type='image/jpeg')
    entry.files = [photo,]

ドキュメントを追跡しようとすると、しかし、私はエラーを取得します:

Traceback (most recent call last):
  File "/home/bar/tests.py", line 76, in test_MongoDGACLogook_creation
    photo.put(f, content_type='image/jpeg')
AttributeError: 'FileField' object has no attribute 'put'

アム私は何かを明らかに不足している?

おかげ

役に立ちましたか?

解決 2

    f = mongoengine.fields.GridFSProxy()
    to_read = open('/home/.../marmot.jpg', 'r')   
    f.put(to_read, filename=os.path.basename(to_read.name))
    to_read.close()

他のヒント

これは、すべてのIMOで明らかにされていませんが、あなたはMongoengineコードを見れば、あなたはput方法がGridFSProxyに記述子を介してアクセスされるFileFieldクラス、(__get____set__方法)で定義されていることがわかりますます。

コードとドキュメントの例を見ると、それがアクセスする唯一の方法を表示されますかFileFieldを使用する記述することです....ので、collection.file_fieldます。

このすべてを考えると、私はそれが今存在しているようMongoengineのAPIを使用してファイルのフィールドのリストを持つことが可能だとは思わない。

あなたがアップロード倍数ファイルとはしている場合は、それを保存しようとListFieldを(FileFieldに())

<input type='file' name='myfiles' multiple="">

files = []
for f in request.FILES.getlist('myfiles'):
    mf = mongoengine.fields.GridFSProxy()
    mf.put(f, filename=f.name)
    files.append(mf)
entry.files = files
entry.save()

私は正確に同じ問題を抱えていました。最終的に私は、この記事の中でGitHubの上@KoppeKTopによって示唆されるようにこのようEmbeddedDocumentを使用して、私のモデル(Pet)を拡張します:

class OneImage(mongoengine.EmbeddedDocument):
    element = ImageField()

class Pet(mongoengine.Document):
    photos = EmbeddedDocumentListField(OneImage)
    # ...more fields... #

私はその後、

を使用して新しいイメージを追加することができます
    i = OneImage()
    i.element.put(form.photo.data.stream)
    entry.photos.append(i)
    entry.save()

これは、常に最良の選択肢ではないかもしれないが、私はプロキシで作業することなく、いつものようにモデルを扱うことができますので、個人的に、私はそれを好みます。そして、私はまた、将来的には他の写真のメタデータの保存、私はする必要ができるかどうか。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top