Crie uma resposta JSON no Django

Vaibhav Vaibhav 30 janeiro 2023
  1. Crie uma resposta JSON usando a classe In-Build do Django JsonResponse
  2. Converta QuerySet em um dicionário Python e crie uma resposta JSON
  3. Crie uma resposta JSON usando a classe In-Build do Django HttpResponse
Crie uma resposta JSON no Django

Ao trabalhar com APIs ou em geral, às vezes temos que enviar dados do servidor para o cliente na forma de JSON (JavaScript Object Notation). Especialmente com APIs, JSON é um formulário obrigatório no qual os dados são enviados ou recuperados.

No Django, trabalhar com respostas JSON é relativamente fácil. Na verdade, existem duas maneiras de criar respostas JSON.

Crie uma resposta JSON usando a classe In-Build do Django JsonResponse

JsonResponse, como o nome sugere, é usado para criar uma resposta JSON. O construtor dessa classe aceita um dicionário Python como parâmetro e cria uma resposta JSON com base nesse dicionário.

O exemplo mais simples possível é o seguinte.

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)

Mas nem todo brilho é ouro. JsonResponse lança um erro ao lidar com um QuerySet ou qualquer modelo Django.

QuerySet não é um dicionário Python. Se tivermos que enviar ou compartilhar um QuerySet ou um modelo Django em uma Resposta JSON, ele deve ser convertido para um dicionário Python.

Agora, existem duas maneiras pelas quais podemos fazer isso. Primeiro, crie uma função que aceite um modelo Django ou um array de QuerySet e os converta em um dicionário Python ou um array de dicionários Python. A segunda opção é usar serializadores Django. Este tutorial falará apenas sobre a função customizada porque serializadores são um grande tópico em si.

Se quiser, você pode aprender sobre serializadores aqui.

Converta QuerySet em um dicionário Python e crie uma resposta JSON

Para fins de explicação, consideraremos um modelo Django simples e aprenderemos como compartilhar tal modelo com uma Resposta JSON.

Considere o seguinte 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

Se tivermos que converter este modelo em um dicionário Python e enviá-lo em uma resposta JSON, podemos criar uma função de utilidade que lida com a conversão. Então, dentro das visualizações, podemos criar um dicionário e adicionar um par de valores-chave para o dicionário Python convertido e, em seguida, criar um JsonResponse.

Consulte o código a seguir.

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)

No código acima, criamos uma função utilitária blogToDictionary() que lida com a conversão de um objeto do tipo Blog. Esta função itera sobre todos os campos, armazenando-os em um dicionário e, finalmente, retornando o dicionário. Então, dentro da visão, convertemos os objetos buscados e criamos um JsonResponse.

Crie uma resposta JSON usando a classe In-Build do Django HttpResponse

Também podemos criar uma resposta JSON usando HttpResponse. O procedimento é praticamente o mesmo. Primeiro criamos um dicionário dos dados que desejamos enviar. Em seguida, criamos um objeto de classe HttpResponse. Definimos o content_type como application/json e convertemos o dicionário Python em JSON usando a biblioteca integrada do Python json. Por último, enviamos o dicionário convertido com o 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 mencionado acima, um QuerySet ou um modelo Django deve ser convertido para um dicionário Python antes de enviá-lo 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.