0

mongoengine FileFieldに関するhttp://mongoengine.org/docs/v0.4/guide/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'

明らかな何かが欠けていますか?

ありがとう

4

4 に答える 4

2

これはIMOでまったく明らかではありませんが、Mongoengineコードを見ると、putメソッドがクラスで定義されていることがわかります。このクラスには、 (およびメソッド)GridFSProxyの記述子を介してアクセスします。FileField__get____set__

ドキュメントのコードと例を見ると、aにアクセスまたは使用する唯一の方法FileFieldは、記述子を使用することですcollection.file_field

これらすべてを考慮すると、現在存在するMongoengineAPIを使用してファイルフィールドのリストを作成することは不可能だと思います。

于 2010-11-19T06:03:08.863 に答える
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()
于 2010-11-19T15:30:31.697 に答える
0

複数のファイルをアップロードして保存しようとしている場合は、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()
于 2012-07-23T11:48:58.903 に答える
0

私はまったく同じ問題を抱えていました。この投稿でGitHubの@KoppeKTopが提案しているように、私はついにPet次のようなEmbeddedDocumentを使用してモデル()を拡張しました。

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

これが常に最良のオプションであるとは限りませんが、プロキシを操作しなくても通常どおりモデルを操作できるため、個人的にはこれを好みます。また、必要に応じて、将来的に他の写真のメタデータを保存することもできます。

于 2015-12-20T10:59:10.383 に答える