问题描述
根据有关mongoengine FileField的文档,我执行了以下操作:
在我的模型中
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'
我是否缺少明显的东西?
谢谢
1楼
这不是明显在所有IMO,但如果你看看Mongoengine代码,你会看到put
方法是在定义GridFSProxy
类,它是通过在一个描述符访问FileField
(在__get__
和__set__
方法)。
查看文档中的代码和示例,似乎访问或使用FileField
的唯一方法是通过描述符.... so, collection.file_field
。
考虑到所有这些,我认为不可能使用现在存在的Mongoengine API来列出文件字段。
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()
3楼
如果要上传多个文件并尝试将其保存为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()
4楼
我有完全一样的问题。
正如在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()
这可能并不总是最好的选择,但我个人更喜欢它,因为我可以照常使用模型,而不必使用代理。 如果需要,我将来也可以保存其他照片元数据。