Ok, ich habe gerade eine Funktion dafür gemacht.
Sie nennen es wie update_document(document, data_dict)
. Er durchläuft die Elemente von data_dict
und ruft die Feldinstanz mit dem Schlüssel von data_dict
ab. Es ruft dann field_value(field, value)
auf, wobei field
die Feldinstanz ist. field_value()
überprüft den Typ des Feldes mit field.__class__
und liefert auf dieser Basis einen Wert, den MongoEngine erwartet. Zum Beispiel kann der Wert eines normalen StringField
so zurückgegeben werden wie er ist, aber für ein EmbeddedDocumentField
muss eine Instanz dieses eingebetteten Dokumenttyps erstellt werden. Es macht auch diesen Trick für die Elemente in Listenfeldern.
Verwendung:
%Vor%Ich habe die meisten der obigen Antworten ausprobiert, aber keine scheint wirklich mit Embedded-Dokumenten zu funktionieren. Obwohl sie die Felder aktualisiert haben, die sie auch getan haben, löschten sie Inhalt der ungefüllten Felder im eingebetteten Dokument.
Dafür habe ich mich für einen Pfad entschieden, der von @hckjck vorgeschlagen wurde. Ich habe eine einfache Funktion geschrieben, die dict in ein Format umwandelt, damit es von document.update
:
Nun diese Daten:
%Vor%wird umgewandelt in:
%Vor%Welches kann so verwendet werden
%Vor%Auch verfügbar in diesem Sinn: Ссылка
Ich weiß nicht, wie effektiv das ist, aber es funktioniert.
Hier ist eine Funktion zum Aktualisieren von Dokumenten mit EmbeddedDocuments. Es basiert auf der Lösung von @ rednaw, berücksichtigt jedoch, dass EmbeddedDocuments über EmbeddedDocuments verfügen.
%Vor% Der Schlüssel hier ist die Methode field_value
, bei der ein eingebettetes Dokument aktualisiert und nicht mit den Daten instanziiert wird.
Verwendungsbeispiel:
%Vor%FYI Das ist eigentlich der Name meiner Katze.
EDIT: Tippfehler in Variablennamen.
Tags und Links python mongodb mongoengine