当前位置: 代码迷 >> python >> 为什么我得到的'FileField'对象没有属性'put'?
  详细解决方案

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

热度:88   发布时间:2023-06-13 15:34:47.0

根据有关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'

我是否缺少明显的东西?

谢谢

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

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

考虑到所有这些,我认为不可能使用现在存在的Mongoengine API来列出文件字段。

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

如果要上传多个文件并尝试将其保存为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()

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

这可能并不总是最好的选择,但我个人更喜欢它,因为我可以照常使用模型,而不必使用代理。 如果需要,我将来也可以保存其他照片元数据。