Créer une réponse JSON dans Django
-
Créer une réponse JSON à l’aide de la classe intégrée de Django
JsonResponse
-
Convertir
QuerySet
en dictionnaire Python et créer une réponse JSON -
Créer une réponse JSON à l’aide de la classe intégrée de Django
HttpResponse
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.