为什么我得到'FileField'对象没有'put'属性?
问题描述:
继http://mongoengine.org/docs/v0.4/guide/gridfs.html文档中关于mongoengine的FileField我做了以下内容:为什么我得到'FileField'对象没有'put'属性?
在我的模型
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'
我是密西西比州显而易见的东西?
感谢
答
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
的唯一方法是通过描述符.... so,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()
答
我有完全相同的问题。正如this post在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()
一个新的形象这可能并不总是是最好的选择,但我个人更喜欢它,因为我可以像平常一样使用模型,而无需使用代理。如果需要,我还可以保存未来的其他照片元数据。
这个答案如何将FileFields放入ListField? – MFB 2014-06-23 18:51:30