لماذا أحصل على كائن "Filefield" ليس له سمة "وضع"؟
-
26-09-2019 - |
سؤال
الآتي http://mongoengine.org/docs/v0.4/guide/gridfs.html وثائق حول 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'
هل أفتقد شيئًا واضحًا؟
شكرًا
المحلول 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()
نصائح أخرى
هذا ليس واضحًا على الإطلاق IMO ، ولكن إذا نظرت إلى رمز Mongoengine ، فسترى أن put
تم تعريف الطريقة في GridFSProxy
الفصل ، الذي يتم الوصول إليه عبر واصف في FileField
(ال __get__
و __set__
أساليب).
بالنظر إلى الرمز والأمثلة في المستندات ، يبدو أن الطريقة الوحيدة للوصول أو استخدام أ FileField
من خلال الوصف .... لذا ، collection.file_field
.
بالنظر إلى كل هذا ، لا أعتقد أنه من الممكن أن يكون لديك قائمة بحقول الملفات باستخدام واجهة برمجة تطبيقات Mongoengine كما هو موجود الآن.
إذا كنت تقوم بتحميل ملفات مضاعفات ومحاولة حفظها قائمة (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()
كان لي بالضبط نفس المشكلة. كما اقترح koppektop على github في هذا المشنور, ، وأخيراً قمت بتوسيع نموذجي (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()
قد لا يكون هذا هو الخيار الأفضل دائمًا ، لكنني شخصياً أفضل ذلك لأنني أستطيع العمل مع النماذج كالمعتاد دون الحاجة إلى العمل مع الوكلاء. ويمكنني أيضًا حفظ بيانات تعريف الصور الأخرى في المستقبل ، إذا كنت بحاجة إلى ذلك.