Es gibt eine Menge Dokumentation zum Serialisieren eines Model QuerySet, aber wie serialisieren Sie einfach die Felder einer Model Instance in JSON?
python
django
json
django-models
serialization
Jason Christa
quelle
quelle
django.core
, um dies zu tun. Gibt es einen bestimmten Grund, das Abfrageset nicht zu serialisieren?Antworten:
Sie können das erforderliche Objekt einfach mit einer Liste umschließen, und das ist alles, was Django-Serialisierer benötigen, um es korrekt zu serialisieren, z.
quelle
[0]
am Ende deiner letzten Zeile, wie @DavorLucic vorgeschlagen hat? Und in Ihrem Listenliteral muss kein Komma nachgestellt werden (aus Liebe zu PEP8;).Wenn Sie mit einer Liste von Modellinstanzen arbeiten, die Sie am besten verwenden können
serializers.serialize()
, passt sie perfekt zu Ihren Anforderungen.Sie haben jedoch ein Problem mit dem Versuch, ein einzelnes Objekt und kein Objekt zu serialisieren
list
. Um verschiedene Hacks loszuwerden, verwenden Sie einfach Djangosmodel_to_dict
(wenn ich mich nicht irre, verlassenserializers.serialize()
Sie sich auch darauf):Sie brauchen jetzt nur noch einen direkten
json.dumps
Aufruf, um es an json zu serialisieren:Das ist es! :) :)
quelle
datetime
Feldern fehl . Auf diese Weise gelöst,json.loads(serialize('json', [obj]))[0]
während Serializer istdjango.core.serializers.serialize
Um den Array-Wrapper zu vermeiden, entfernen Sie ihn, bevor Sie die Antwort zurückgeben:
Ich fand diesen interessanten Beitrag auch zu diesem Thema:
http://timsaylor.com/convert-django-model-instances-to-dictionaries
Es verwendet django.forms.models.model_to_dict, das wie das perfekte Werkzeug für den Job aussieht.
quelle
Es gibt eine gute Antwort darauf und ich bin überrascht, dass es nicht erwähnt wurde. Mit ein paar Zeilen können Sie Daten, Modelle und alles andere verarbeiten.
Erstellen Sie einen benutzerdefinierten Encoder, der Modelle verarbeiten kann:
Verwenden Sie es jetzt, wenn Sie json.dumps verwenden
Jetzt können Modelle, Daten und alles serialisiert werden und es muss nicht mehr in einem Array oder serialisiert und unserialisiert sein. Alles, was Sie haben, das benutzerdefiniert ist, kann einfach zur
default
Methode hinzugefügt werden.Sie können Djangos native JsonResponse sogar folgendermaßen verwenden:
quelle
json.dumps
undjson.dump
Methoden. Auf diese Weise müssen Sie den Workflow der Anwendung nicht ändern, da Sie benutzerdefinierte Objekte verwenden oder einen anderen Methodenaufruf hinzufügen, bevor Sie in json konvertieren. Fügen Sie einfach Ihren Konvertierungscode in den Encoder ein und Sie können loslegen.Es hört sich so an, als würden Sie die Datenstruktur einer Django-Modellinstanz für die Interoperabilität serialisieren. Die anderen Poster sind korrekt: Wenn Sie möchten, dass das serialisierte Formular mit einer Python-Anwendung verwendet wird, die die Datenbank über Djangos API abfragen kann, möchten Sie ein Abfrageset mit einem Objekt serialisieren. Wenn Sie andererseits eine Möglichkeit benötigen, die Modellinstanz an einer anderen Stelle wieder aufzublasen, ohne die Datenbank zu berühren oder Django zu verwenden, müssen Sie ein wenig arbeiten.
Folgendes mache ich:
Zunächst verwende ich
demjson
für die Konvertierung. Es war zufällig das, was ich zuerst gefunden habe, aber es ist vielleicht nicht das Beste. Meine Implementierung hängt von einer ihrer Funktionen ab, aber es sollte ähnliche Möglichkeiten mit anderen Konvertern geben.Zweitens implementieren Sie eine
json_equivalent
Methode für alle Modelle, die möglicherweise serialisiert werden müssen. Dies ist eine magische Methodedemjson
, aber wahrscheinlich möchten Sie darüber nachdenken, egal für welche Implementierung Sie sich entscheiden. Die Idee ist, dass Sie ein Objekt zurückgeben, in das direkt konvertiert werden kannjson
(dh ein Array oder ein Wörterbuch). Wenn Sie dies wirklich automatisch tun möchten:Dies ist für Sie nur hilfreich, wenn Sie eine vollständig flache Datenstruktur haben (nein
ForeignKeys
, nur Zahlen und Zeichenfolgen in der Datenbank usw.). Andernfalls sollten Sie ernsthaft darüber nachdenken, wie Sie diese Methode richtig implementieren können.Drittens rufen
demjson.JSON.encode(instance)
Sie an und Sie haben, was Sie wollen.quelle
Wenn Sie fragen, wie ein einzelnes Objekt aus einem Modell serialisiert werden soll und Sie wissen, dass Sie nur ein Objekt im Abfrageset erhalten (z. B. mithilfe von objects.get), verwenden Sie Folgendes:
das würde dir etwas von der Form bringen:
quelle
Ich habe dieses Problem gelöst, indem ich meinem Modell eine Serialisierungsmethode hinzugefügt habe:
Hier ist das ausführliche Äquivalent für diejenigen, die Einzeiler ablehnen:
_meta.fields
ist eine geordnete Liste von Modellfeldern, auf die von Instanzen und vom Modell selbst aus zugegriffen werden kann.quelle
Hier ist meine Lösung dafür, mit der Sie den JSON einfach anpassen und zugehörige Datensätze organisieren können
Implementieren Sie zunächst eine Methode für das Modell. Ich rufe an,
json
aber du kannst es nennen, wie du willst, zB:Dann mache ich in der Ansicht:
quelle
car.json()
Verwenden Sie Liste, es wird das Problem lösen
Schritt 1:
Schritt 2:
Schritt 3:
quelle
Verwenden Sie zum Serialisieren und Deserialisieren Folgendes:
quelle
.values()
ist das, was ich brauchte, um eine Modellinstanz in JSON zu konvertieren.Dokumentation zu .values (): https://docs.djangoproject.com/de/3.0/ref/models/querysets/#values
Beispiel für die Verwendung mit einem Modell namens Project .
Hinweis: Ich verwende das Django Rest Framework
Ergebnis einer gültigen ID:
quelle
Wenn Sie das einzelne Modellobjekt als JSON-Antwort an einen Client zurückgeben möchten , können Sie diese einfache Lösung ausführen:
quelle
Verwenden Sie Django Serializer mit
python
Format,Was ist der Unterschied zwischen
json
undpython
Format?Das
json
Format gibt das Ergebnis zurück,str
währendpython
das Ergebnis entwederlist
oder zurückgegeben wirdOrderedDict
quelle
OrderedDict
nichtdict
Es scheint nicht, dass Sie eine Instanz serialisieren können, sondern Sie müssen ein QuerySet eines Objekts serialisieren.
Ich habe
svn
keine Django-Version mehr, daher ist dies möglicherweise nicht in früheren Versionen der Fall.quelle
Ich gebe das Diktat meiner Instanz zurück
es gibt also so etwas wie {'field1': value, "field2": value, ....} zurück
quelle
TypeError: <django.db.models.base.ModelState object at 0x7f2b3bf62310> is not JSON serializable
Wie wäre es mit diesem Weg:
oder alles ausschließen, was Sie nicht wollen.
quelle
Alle diese Antworten waren ein wenig hackig im Vergleich zu dem, was ich von einem Framework erwarten würde, der einfachsten Methode, denke ich bei weitem, wenn Sie das restliche Framework verwenden:
Hierbei wird der Serializer direkt verwendet, wobei die darin definierten Felder sowie etwaige Zuordnungen usw. berücksichtigt werden.
quelle