关于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'
我错过了一些明显的东西吗?
由于
答案 0 :(得分:2)
这在所有IMO中并不明显,但是如果你看一下Mongoengine代码,你会发现put
类是在GridFSProxy
类中定义的,可以通过描述符来访问FileField
(__get__
和__set__
方法)。
查看文档中的代码和示例,看来访问或使用FileField
的唯一方法是通过描述符....所以,collection.file_field
。
鉴于这一切,我认为现在使用Mongoengine API的文件字段列表是不可能的。
答案 1 :(得分: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()
答案 2 :(得分: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()