为什么我得到'FileField'对象没有属性'put'?

时间:2010-11-18 21:52:03

标签: python mongodb gridfs mongoengine

关于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'

我错过了一些明显的东西吗?

由于

3 个答案:

答案 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()