Convertir un QuerySet en JSON dans Django
-
Convertir un
QuerySet
enJSON
à l’aide d’une méthode personnalisée -
Convertir un
QuerySet
enJSON
à l’aide des sérialiseurs intégrés de Django -
Convertir un
QuerySet
en unJSON
en utilisant la fonctionvalues()
Dans Django, tous les gestionnaires de modèles renvoient un QuerySet
lorsqu’une requête est appliquée sur un modèle. Un QuerySet
peut facilement être utilisé dans le langage de modélisation Python et Django. Nous pouvons effectuer de nombreuses actions sur un QuerySet
pour récupérer les résultats ou les enregistrements souhaités. Mais un QuerySet
a un inconvénient : ils ne sont pas sérialisables JSON
.
En dehors des applications web, Django est aussi utilisé pour faire des API, et dans les API, JSON
est essentiel car les données voyagent au format JSON
entre le serveur et le client.
Bien qu’il ne soit pas directement possible de convertir un QuerySet
en JSON
, nous pouvons utiliser un QuerySet
pour créer un objet Python ou un JSON
stringifié. Il y a plusieurs façons d’y parvenir. Cet article discutera des meilleures façons de convertir un QuerySet
en JSON
.
Convertir un QuerySet
en JSON
à l’aide d’une méthode personnalisée
Supposons que nous ayons un modèle Django comme suit. Nous pouvons écrire une fonction qui acceptera un objet de ce modèle et retournera une représentation de dictionnaire de l’objet.
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)
Et la méthode pour gérer la conversion est la suivante.
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)
Cette approche nous donne plus de contrôle sur les données que nous souhaitons inclure dans la représentation du dictionnaire. Par exemple, si nous avions des clés étrangères, nous pourrions inclure diverses informations sur les modèles référencés. Nous pouvons également effectuer quelques calculs et les inclure dans le dictionnaire.
Convertir un QuerySet
en JSON
à l’aide des sérialiseurs intégrés de Django
Django a des sérialiseurs intégrés qui peuvent être utilisés pour convertir des modèles sous la forme souhaitée. On peut transformer un modèle au format JSON
, XML
, JSONL
et YAML
en utilisant des sérialiseurs. Certains des formats nécessitent des bibliothèques Python supplémentaires pour fonctionner.
Supposons que nous devions convertir le modèle Person
ci-dessus en un format JSON
. Pour ce faire, nous ferions ce qui suit.
from django.core import serializers
person = serializers.serialize("json", Person.objects.get(id=25))
people = serializers.serialize("json", Person.objects.all())
Un sérialiseur peut convertir un seul modèle ainsi qu’un QuerySet
. Les variables person
et people
contiendront désormais les données au format JSON
.
Disons que nous devons uniquement convertir les champs de nom du modèle. Pour y parvenir, nous ferions ce qui suit.
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")
)
Nous devons définir le paramètre fields
sur un tuple de noms de champs du modèle. Un point clé à noter ici est que la clé primaire, le id
, est toujours sérialisée, que vous le mentionniez ou non.
Pour en savoir plus sur les sérialiseurs, reportez-vous à la documentation officielle de Django ici.
Convertir un QuerySet
en un JSON
en utilisant la fonction values()
La troisième approche utilise la méthode values()
qui peut être appelée sur un QuerySet
. Un QuerySet
renvoie un ensemble d’instances de modèle, tandis que la méthode values()
renvoie un ensemble de dictionnaires représentant des instances de modèle.
Référez-vous au code suivant.
person = Person.objects.filter(age=25).values()
people = Person.objects.all().values()
Par défaut, un dictionnaire contient tous les champs de la table. Si nous devons limiter les champs, nous pouvons utiliser les arguments positionnels facultatifs, *fields
, dans cette méthode. Reportez-vous à l’extrait de code suivant.
person = Person.objects.filter(age=25).values("id", "age", "firstName", "lastName")
people = Person.objects.all().values("id", "firstName")