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
    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 回答
2

这一点在 IMO 中并不明显,但是如果您查看 Mongoengine 代码,您会发现该put方法是在GridFSProxy类中定义的,该类是通过FileField__get__and__set__方法)中的描述符访问的。

查看文档中的代码和示例,似乎访问或使用 a 的唯一方法FileField是通过描述符....so, collection.file_field.

鉴于这一切,我认为不可能使用现在存在的 Mongoengine API 来创建文件字段列表。

于 2010-11-19T06:03:08.863 回答
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 回答