Convertir un QuerySet en JSON dans Django

Vaibhav Vaibhav 30 janvier 2023
  1. Convertir un QuerySet en JSON à l’aide d’une méthode personnalisée
  2. Convertir un QuerySet en JSON à l’aide des sérialiseurs intégrés de Django
  3. Convertir un QuerySet en un JSON en utilisant la fonction values()
Convertir un QuerySet en JSON dans Django

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")
Vaibhav Vaibhav avatar Vaibhav Vaibhav avatar

Vaibhav is an artificial intelligence and cloud computing stan. He likes to build end-to-end full-stack web and mobile applications. Besides computer science and technology, he loves playing cricket and badminton, going on bike rides, and doodling.