Crea una respuesta JSON en Django
-
Cree una respuesta JSON utilizando la clase incorporada de Django
JsonResponse
-
Convierta
QuerySet
en un diccionario de Python y cree una respuesta JSON -
Cree una respuesta JSON utilizando la clase incorporada de Django
HttpResponse
Cuando trabajamos con API o en general, a veces tenemos que enviar datos desde el servidor al cliente en forma de JSON (JavaScript Object Notation). Especialmente con las API, JSON es un formulario obligatorio en el que se envían o recuperan datos.
En Django, trabajar con JSON Responses es relativamente fácil. En realidad, hay dos formas en las que podemos crear respuestas JSON.
Cree una respuesta JSON utilizando la clase incorporada de Django JsonResponse
JsonResponse
, como su nombre indica, se utiliza para crear una respuesta JSON. El constructor de esta clase acepta un diccionario de Python como parámetro y crea una respuesta JSON basada en ese diccionario.
El ejemplo más simple posible es el siguiente.
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)
Pero no todo el brillo es oro. JsonResponse
arroja un error cuando se trata de un QuerySet
o cualquier modelo de Django.
QuerySet
no es un diccionario de Python. Si tenemos que enviar o compartir un QuerySet
o un modelo Django en una Respuesta JSON, se debe convertir a un diccionario Python.
Ahora, hay dos formas en las que podemos hacer esto. Primero, cree una función que acepte un modelo de Django o un array de QuerySet
y los convierta en un diccionario de Python o un array de diccionarios de Python. La segunda opción es usar serializadores Django. Este tutorial solo hablará sobre la función personalizada porque los serializadores son un gran tema en sí mismo.
Si lo desea, puede obtener información sobre los serializadores aquí.
Convierta QuerySet
en un diccionario de Python y cree una respuesta JSON
En aras de la explicación, consideraremos un modelo Django simple y aprenderemos cómo compartir dicho modelo con una respuesta JSON.
Considere el siguiente modelo.
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 tenemos que convertir este modelo en un diccionario de Python y enviarlo en una Respuesta JSON, podemos crear una función de utilidad que maneje la conversión. Luego, dentro de las vistas, podemos crear un diccionario y agregar un par clave-valor para el diccionario de Python convertido y luego crear una JsonResponse
.
Consulte el siguiente código.
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)
En el código anterior, creamos una función de utilidad blogToDictionary()
que maneja la conversión de un objeto de tipo Blog
. Esta función itera sobre todos los campos, los almacena en un diccionario y, finalmente, devuelve el diccionario. Luego, dentro de la vista, convertimos los objetos recuperados y creamos una JsonResponse
.
Cree una respuesta JSON utilizando la clase incorporada de Django HttpResponse
También podemos crear una respuesta JSON usando HttpResponse
. El procedimiento es prácticamente el mismo. Primero creamos un diccionario de los datos que deseamos enviar. Luego hacemos un objeto de clase HttpResponse
. Establecemos content_type
como application/json
y convertimos el diccionario Python a JSON usando la biblioteca incorporada de Python json
. Por último, enviamos el diccionario convertido con 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")
Como se mencionó anteriormente, un QuerySet
o un modelo de Django debe convertirse a un diccionario de Python antes de enviarlo usando este método.