Почему я получаю объект 'FileField' без атрибута 'put'? - PullRequest
0 голосов
/ 19 ноября 2010

После 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'

Я что-то упускаю из виду?

Спасибо

Ответы [ 4 ]

2 голосов
/ 19 ноября 2010
    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()
2 голосов
/ 19 ноября 2010

Это совсем не очевидно для IMO, но если вы посмотрите на код Mongoengine, вы увидите, что метод put определен в классе GridFSProxy, доступ к которому осуществляется через дескриптор в FileField (__get__ и __set__).

Глядя на код и примеры в документации, кажется, что единственный способ получить или использовать FileField - через дескриптор ...., collection.file_field.

Учитывая все это, я не думаю, что возможно иметь список полей файла, используя Mongoengine API, как он существует сейчас.

0 голосов
/ 20 декабря 2015

У меня была точно такая же проблема.Как предложено @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()

Это не всегда лучший вариант, но лично я предпочитаю его, потому что я могу работать с моделями, как обычно, без необходимости работы с прокси.И я могу также сохранить другие метаданные фотографии в будущем, если мне нужно.

0 голосов
/ 23 июля 2012

Если вы загружаете несколько файлов и пытаетесь сохранить их, 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()
...