Warum bekomme ich ‚Filefield‘ Objekt hat kein Attribut ‚put‘?
-
26-09-2019 - |
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
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.