2010-11-18 95 views
0

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' 

我是密西西比州显而易见的东西?

感谢

回答

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

这个答案如何将FileFields放入ListField? – MFB 2014-06-23 18:51:30

2

这不是明显在所有IMO,但如果你看看Mongoengine代码,你会看到put方法在GridFSProxy类,它是通过一个描述符FileField访问定义(方法__get____set__)。

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

考虑到这一切,我认为现在不存在使用Mongoengine API的文件字段列表。

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

我有完全相同的问题。正如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() 

一个新的形象这可能并不总是是最好的选择,但我个人更喜欢它,因为我可以像平常一样使用模型,而无需使用代理。如果需要,我还可以保存未来的其他照片元数据。

相关问题