Почему я получаю объект «FileField», не имеет атрибута «поставить»?

StackOverflow https://stackoverflow.com/questions/4219955

Вопрос

Следующий http://mongoengine.org/docs/v0.4/guide/gridfs.html. Документация о MongoEngine Filefield I сделала следующее:

В моей модели

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()

Другие советы

Это совсем не очевидно, но если вы посмотрите на код Монгоэнергин, вы увидите, что put метод определен в GridFSProxy класс, который доступа к дескриптору в FileField (то __get__ а также __set__ Методы).

Глядя на код и примеры в документах, он выглядит единственным способом доступа или использования FileField через дескриптор .... Итак, collection.file_field.

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

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

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