なぜ私は「FileFieldに」オブジェクトには属性「プット」を持っていないになっていますか?
-
26-09-2019 - |
質問
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()
これは、常に最良の選択肢ではないかもしれないが、私はプロキシで作業することなく、いつものようにモデルを扱うことができますので、個人的に、私はそれを好みます。そして、私はまた、将来的には他の写真のメタデータの保存、私はする必要ができるかどうか。