Frage

Im Anschluss an http://mongoengine.org/docs/v0.4/guide /gridfs.html Dokumentation über mongoengine Filefield ich habe die folgenden:

In meinem Modell

files = ListField(FileField())

In meinem Test-Code

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

Der Versuch, das Dokument zu folgen, ich jedoch eine Fehlermeldung angezeigt:

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'

Bin ich etwas fehlt offensichtlich?

Danke

War es hilfreich?

Lösung 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()

Andere Tipps

Das ist nicht selbstverständlich bei allen IMO, aber wenn Sie den Mongoengine Code sehen Sie werden sehen, dass die put Methode in der GridFSProxy Klasse definiert ist, die über eine Deskriptor in FileField zugegriffen wird (die __get__ und __set__ Methoden) .

auf den Code der Suche und den Beispielen in der Dokumentation scheint es die einzige Möglichkeit, den Zugriff auf oder verwenden Sie ein FileField ist durch den Deskriptor .... so, collection.file_field.

In Anbetracht all dies, ich glaube nicht, es ist möglich, eine Liste von Dateifeldern hat mit der Mongoengine API, wie es jetzt existiert.

Wenn Sie das Hochladen sind Multiples Dateien und versuchen, es zu speichern ein 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()

Ich hatte genau das gleiche Problem. Wie in diesen Beitrag , habe ich endlich erweitert mein Modell (Pet) eine EmbeddedDocument wie folgt aus:

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

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

Ich kann dann ein neues Bild hinzufügen mit

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

Das ist vielleicht nicht immer die beste Wahl, aber ich persönlich bevorzuge es, weil ich mit Modellen wie gewohnt arbeiten kann, ohne sie mit Proxies arbeiten zu müssen. Und ich kann auch speichern andere Foto-Metadaten in die Zukunft, wenn ich muss.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top