Crie uma resposta JSON no Django
-
Crie uma resposta JSON usando a classe In-Build do Django
JsonResponse
-
Converta
QuerySet
em um dicionário Python e crie uma resposta JSON -
Crie uma resposta JSON usando a classe In-Build do Django
HttpResponse
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.