Créer une réponse JSON dans Django

Vaibhav Vaibhav 30 janvier 2023
  1. Créer une réponse JSON à l’aide de la classe intégrée de Django JsonResponse
  2. Convertir QuerySet en dictionnaire Python et créer une réponse JSON
  3. Créer une réponse JSON à l’aide de la classe intégrée de Django HttpResponse
Créer une réponse JSON dans Django

Lorsque nous travaillons avec des API ou en général, nous devons parfois envoyer des données du serveur au client sous la forme de JSON (JavaScript Object Notation). Surtout avec les API, JSON est un formulaire obligatoire dans lequel les données sont envoyées ou récupérées.

Dans Django, travailler avec les réponses JSON est relativement simple. Il existe en fait deux manières de créer des réponses JSON.

Créer une réponse JSON à l’aide de la classe intégrée de Django JsonResponse

JsonResponse, comme son nom l’indique, est utilisé pour créer une réponse JSON. Le constructeur de cette classe accepte un dictionnaire Python en tant que paramètre et crée une réponse JSON basée sur ce dictionnaire.

L’exemple le plus simple possible est le suivant.

from django.views import View
from django.http import JsonResponse

# Function based view


def myView(request):
    data = {
        "name": "Vaibhav",
        "age": 20,
        "hobbies": ["Coding", "Art", "Gaming", "Cricket", "Piano"],
    }

    return JsonResponse(data)


# Class based view
class MyView(View):
    def get(self, request):
        data = {
            "name": "Vaibhav",
            "age": 20,
            "hobbies": ["Coding", "Art", "Gaming", "Cricket", "Piano"],
        }

        return JsonResponse(data)

Mais toutes les paillettes ne sont pas dorées. JsonResponse renvoie une erreur lorsqu’il s’agit d’un QuerySet ou de tout modèle Django.

QuerySet n’est pas un dictionnaire Python. Si nous devons envoyer ou partager un QuerySet ou un modèle Django dans une réponse JSON, il doit être converti en dictionnaire Python.

Maintenant, il y a deux façons dont nous pouvons le faire. Tout d’abord, créez une fonction qui accepte un modèle Django ou un tableau de QuerySet et les convertit en un dictionnaire Python ou un tableau de dictionnaires Python. La deuxième option consiste à utiliser les sérialiseurs Django. Ce tutoriel ne parlera que de la fonction personnalisée car les sérialiseurs sont un gros sujet en soi.

Si vous le souhaitez, vous pouvez en savoir plus sur les sérialiseurs ici.

Convertir QuerySet en dictionnaire Python et créer une réponse JSON

Par souci d’explication, nous allons considérer un modèle Django simple et apprendre à partager un tel modèle avec une réponse JSON.

Considérez le modèle suivant.

from django.db import models
from django.contrib.auth.models import User


class Blog(models.Model):
    author = models.ForeignKey(User, on_delete=models.CASCADE, related_name="blogs")
    title = models.CharField(max_length=250)
    description = models.CharField(max_length=500)
    showcaseImage = models.ImageField(upload_to="Images/")
    dateTimeOfCreation = models.DateTimeField(auto_now=True)
    shareURL = models.URLField()
    likes = models.IntegerField()
    disLikes = models.IntegerField()
    bookmarks = models.IntegerField()

    def __str__(self):
        return self.title

Si nous devons convertir ce modèle en dictionnaire Python et l’envoyer dans une réponse JSON, nous pouvons créer une fonction utilitaire qui gère la conversion. Ensuite, à l’intérieur des vues, nous pouvons créer un dictionnaire et ajouter une paire clé-valeur pour le dictionnaire Python converti, puis créer un JsonResponse.

Référez-vous au code suivant.

from django.views import View
from django.http import JsonResponse
from . import models


def blogToDictionary(blog):
    """
    A utility function to convert object of type Blog to a Python Dictionary
    """
    output = {}
    output["title"] = blog.title
    output["description"] = blog.description
    output["showcaseImage"] = blog.showcaseImage.url
    output["dateTimeOfCreation"] = blog.dateTimeOfCreation.strftime(
        "%m/%d/%Y, %H:%M:%S"
    )
    output["shareURL"] = blog.shareURL
    output["likes"] = blog.likes
    output["disLikes"] = blog.disLikes
    output["bookmarks"] = blog.bookmarks

    return output


# Function based view
def myView(request):
    # Single Blog
    blog = models.Blog.objects.get(id=1)

    # Multiple Blogs
    blogs = models.Blog.objects.all()
    tempBlogs = []

    # Converting `QuerySet` to a Python Dictionary
    blog = blogToDictionary(blog)

    for i in range(len(blogs)):
        tempBlogs.append(
            blogToDictionary(blogs[i])
        )  # Converting `QuerySet` to a Python Dictionary

    blogs = tempBlogs

    data = {"blog": blog, "blogs": blogs}

    return JsonResponse(data)

Dans le code ci-dessus, nous avons créé une fonction utilitaire blogToDictionary() qui gère la conversion d’un objet de type Blog. Cette fonction parcourt tous les champs, les stocke dans un dictionnaire et, enfin, renvoie le dictionnaire. Ensuite, à l’intérieur de la vue, nous avons converti les objets récupérés et créé une JsonResponse.

Créer une réponse JSON à l’aide de la classe intégrée de Django HttpResponse

Nous pouvons également créer une réponse JSON en utilisant HttpResponse. La procédure est à peu près la même. Nous créons d’abord un dictionnaire des données que nous souhaitons envoyer. Ensuite, nous créons un objet de classe HttpResponse. Nous définissons le content_type comme application/json et convertissons le dictionnaire Python en JSON à l’aide de la bibliothèque intégrée de Python json. Enfin, nous envoyons le dictionnaire converti avec le HttpResponse.

import json
from django.views import View
from django.http import JsonResponse

# Function based view


def myView(request):
    data = {
        "name": "Vaibhav",
        "age": 20,
        "hobbies": ["Coding", "Art", "Gaming", "Cricket", "Piano"],
    }

    return HttpResponse(json.dumps(data), content_type="application/json")


# Class based view
class MyView(View):
    def get(self, request):
        data = {
            "name": "Vaibhav",
            "age": 20,
            "hobbies": ["Coding", "Art", "Gaming", "Cricket", "Piano"],
        }

        return HttpResponse(json.dumps(data), content_type="application/json")

Comme mentionné ci-dessus, un QuerySet ou un modèle Django doit être converti en un dictionnaire Python avant de l’envoyer à l’aide de cette méthode.

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.