Почему я получаю объект «FileField», не имеет атрибута «поставить»?
-
26-09-2019 - |
Вопрос
Следующий 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()
Это может не всегда быть лучшим вариантом, но лично я предпочитаю это, потому что я могу работать с моделями как обычно без необходимости работать с прокси. И я также могу сохранить другие метаданные фото в будущем, если мне нужно.