Crea una respuesta JSON en Django

Vaibhav Vaibhav 20 noviembre 2021
  1. Cree una respuesta JSON utilizando la clase incorporada de Django JsonResponse
  2. Convierta QuerySet en un diccionario de Python y cree una respuesta JSON
  3. Cree una respuesta JSON utilizando la clase incorporada de Django HttpResponse
Crea una respuesta JSON en Django

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.

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.

Artículo relacionado - Django JSON