[英]Why do I keep getting AttributeError: 'module' object has no attribute
[英]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.