簡體   English   中英

為什么我得到的'FileField'對象沒有屬性'put'?

[英]Why do I getting 'FileField' object has no attribute 'put'?

根據有關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'

我是否缺少明顯的東西?

謝謝

這不是明顯在所有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()

這可能並不總是最好的選擇,但我個人更喜歡它,因為我可以照常使用模型,而不必使用代理。 如果需要,我將來也可以保存其他照片元數據。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM