سؤال

الآتي 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()

قد لا يكون هذا هو الخيار الأفضل دائمًا ، لكنني شخصياً أفضل ذلك لأنني أستطيع العمل مع النماذج كالمعتاد دون الحاجة إلى العمل مع الوكلاء. ويمكنني أيضًا حفظ بيانات تعريف الصور الأخرى في المستقبل ، إذا كنت بحاجة إلى ذلك.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top