Question

http://mongoengine.org/docs/v0.4/guide /gridfs.html documentation sur mongoengine FileField je l'ai fait ce qui suit:

Dans mon modèle

files = ListField(FileField())

Dans mon code de test

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

Essayer de suivre la doc, mais je reçois une erreur:

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'

Suis-je manque quelque chose évidente?

Merci

Était-ce utile?

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

Autres conseils

Ce n'est pas évident du tout de l'OMI, mais si vous regardez le code Mongoengine vous verrez que la méthode put est définie dans la classe GridFSProxy, qui est accessible via un descripteur dans FileField (les méthodes de __get__ et __set__) .

En regardant le code et les exemples dans la documentation, il semble que le seul moyen d'accéder ou d'utiliser un FileField est par le descripteur .... donc, collection.file_field.

Compte tenu de tout cela, je ne pense pas qu'il est possible d'avoir une liste de champs de fichiers en utilisant l'API Mongoengine tel qu'il existe maintenant.

Si vous êtes des fichiers multiples de téléchargement et d'essayer de sauver 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()

J'ai eu exactement le même problème. Comme l'a suggéré @KoppeKTop sur GitHub ce poste , j'ai finalement mon modèle étendu (Pet) en utilisant un EmbeddedDocument comme ceci:

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

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

Je peux alors ajouter une nouvelle image en utilisant

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

Cela peut ne pas toujours être la meilleure option, mais personnellement je préfère parce que je peux travailler avec des modèles comme d'habitude sans avoir à travailler avec des mandataires. Et je peux aussi sauver d'autres métadonnées photo à l'avenir, si je dois.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top