Konvertieren Sie ein QuerySet in ein JSON in Django
-
Konvertieren Sie ein
QuerySetin einJSONmit einer benutzerdefinierten Methode -
Konvertieren Sie ein
QuerySetin einJSONmit den integrierten Serializern von Djangogo -
Konvertieren Sie ein
QuerySetin einJSONmit 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")
