Konvertieren Sie ein QuerySet in ein JSON in Django
-
Konvertieren Sie ein
QuerySet
in einJSON
mit einer benutzerdefinierten Methode -
Konvertieren Sie ein
QuerySet
in einJSON
mit den integrierten Serializern von Djangogo -
Konvertieren Sie ein
QuerySet
in einJSON
mit der Funktionvalues()
In Django geben alle Modellmanager ein QuerySet
zurück, wenn eine Abfrage auf ein Modell angewendet wird. Ein QuerySet
kann problemlos in Python und der Templating-Sprache von Django verwendet werden. Wir können viele Aktionen über ein QuerySet
ausführen, um die gewünschten Ergebnisse oder Datensätze abzurufen. Ein QuerySet
hat jedoch einen Nachteil: Sie sind nicht JSON
serialisierbar.
Abgesehen von Webanwendungen wird Django auch verwendet, um APIs zu erstellen, und bei APIs ist JSON
unerlässlich, da Daten im JSON
-Format zwischen Server und Client reisen.
Obwohl es nicht direkt möglich ist, ein QuerySet
in JSON
zu konvertieren, können wir ein QuerySet
verwenden, um ein Python-Objekt oder ein stringifiziertes JSON
zu erstellen. Es gibt mehrere Möglichkeiten, dies zu erreichen. In diesem Artikel werden einige der besten Möglichkeiten beschrieben, um ein QuerySet
in ein JSON
zu konvertieren.
Konvertieren Sie ein QuerySet
in ein JSON
mit einer benutzerdefinierten Methode
Angenommen, wir haben ein Django-Modell wie folgt. Wir können eine Funktion schreiben, die ein Objekt dieses Modells akzeptiert und eine Dictionarydarstellung des Objekts zurückgibt.
from django.db import models
class Person(models.Model):
username = models.CharField(max_length=200, unique=True)
firstName = models.CharField(max_length=200)
middleName = models.CharField(max_length=200)
lastName = models.CharField(max_length=200)
age = models.IntegerField(default=0)
Und die Methode zur Handhabung der Konvertierung ist wie folgt.
def personToDictionary(person):
if person == None:
return None
dictionary = {}
dictionary["username"] = person.username
dictionary["firstName"] = person.firstName
dictionary["middleName"] = person.middleName
dictionary["lastName"] = person.lastName
dictionary["age"] = person.age
return dictionary
person = Person.objects.get(id=25)
personDictionary = personToDictionary(person)
Dieser Ansatz gibt uns mehr Kontrolle über die Daten, die wir in die Dictionarydarstellung aufnehmen möchten. Wenn wir beispielsweise Fremdschlüssel hätten, könnten wir verschiedene Informationen der referenzierten Modelle einschließen. Wir können auch einige Berechnungen durchführen und in das Dictionary aufnehmen.
Konvertieren Sie ein QuerySet
in ein JSON
mit den integrierten Serializern von Djangogo
Django verfügt über integrierte Serializer, mit denen Modelle in die gewünschte Form konvertiert werden können. Mit Serializern kann ein Modell in die Formate JSON
, XML
, JSONL
und YAML
umgewandelt werden. Einige der Formate erfordern einige zusätzliche Python-Bibliotheken, um zu funktionieren.
Angenommen, wir müssen das obige Person
-Modell in ein JSON
-Format konvertieren. Dazu würden wir Folgendes tun.
from django.core import serializers
person = serializers.serialize("json", Person.objects.get(id=25))
people = serializers.serialize("json", Person.objects.all())
Ein Serializer kann sowohl ein einzelnes Modell als auch ein QuerySet
konvertieren. Die Variablen person
und people
enthalten nun die Daten im JSON
-Format.
Nehmen wir an, wir müssen nur die Namensfelder des Modells konvertieren. Um dies zu erreichen, würden wir Folgendes tun.
from django.core import serializers
person = serializers.serialize(
"json", Person.objects.get(id=25), fields=("firstName", "middleName", "lastName")
)
people = serializers.serialize(
"json", Person.objects.all(), fields=("firstName", "middleName", "lastName")
)
Wir müssen den Parameter fields
auf ein Tupel von Feldnamen des Modells setzen. Ein wichtiger Punkt hier ist, dass der Primärschlüssel, die id
, immer serialisiert wird, egal ob Sie ihn erwähnen oder nicht.
Weitere Informationen zu Serializern finden Sie in der offiziellen Dokumentation von Django hier.
Konvertieren Sie ein QuerySet
in ein JSON
mit der Funktion values()
Der dritte Ansatz verwendet die Methode values()
, die über ein QuerySet
aufgerufen werden kann. Ein QuerySet
gibt eine Menge von Modellinstanzen zurück, während die Methode values()
eine Menge von Dictionaries zurückgibt, die Modellinstanzen repräsentieren.
Siehe den folgenden Code.
person = Person.objects.filter(age=25).values()
people = Person.objects.all().values()
Standardmäßig enthält ein Dictionary alle Felder der Tabelle. Wenn wir die Felder einschränken müssen, können wir in dieser Methode die optionalen Positionsargumente *fields
verwenden. Weitere Informationen finden Sie im folgenden Code-Snippet.
person = Person.objects.filter(age=25).values("id", "age", "firstName", "lastName")
people = Person.objects.all().values("id", "firstName")