Pregunta

Siguiendo http://mongoengine.org/docs/v0.4/guide /gridfs.html documentación acerca mongoengine FileField me hizo lo siguiente:

En mi modelo

files = ListField(FileField())

En mi código de prueba

    # Create an entry 
    photo = FileField()
    f  = open('/home/foo/marmot.jpg', 'r')   
    photo.put(f, content_type='image/jpeg')
    entry.files = [photo,]

Tratando de seguir el documento, sin embargo me da un error:

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'

Me estoy perdiendo algo obvio?

Gracias

¿Fue útil?

Solución 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()

Otros consejos

Esto no es evidente en absoluto la OMI, pero si nos fijamos en el código Mongoengine verá que el método put se define en la clase GridFSProxy, al que se accede a través de un descriptor en FileField (los métodos __get__ y __set__) .

Si examina el código y los ejemplos en los documentos, parece que la única manera de acceder o utilizar un FileField es a través del descriptor .... así, collection.file_field.

Teniendo en cuenta todo esto, yo no creo que sea posible tener una lista de campos de archivos utilizando el API Mongoengine tal como existe ahora.

Si son múltiplos carga de archivos y tratar de guardarlo un 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()

Yo tenía exactamente el mismo problema. Según lo sugerido por @KoppeKTop en GitHub en este post , por fin extendido mi modelo (Pet) utilizando un EmbeddedDocument como esto:

class OneImage(mongoengine.EmbeddedDocument):
    element = ImageField()

class Pet(mongoengine.Document):
    photos = EmbeddedDocumentListField(OneImage)
    # ...more fields... #

a continuación, puede agregar una nueva imagen utilizando

    i = OneImage()
    i.element.put(form.photo.data.stream)
    entry.photos.append(i)
    entry.save()

Esto puede no ser siempre la mejor opción, pero personalmente lo prefiero porque puedo trabajar con modelos como de costumbre, sin tener que trabajar con servidores proxy. Y también puedo guardar otros metadatos foto en el futuro, si lo necesita.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top