HOWTO · Django
Crie uma resposta JSON no Django
Aprenda a criar uma resposta JSON no Django.
Nesta página
Use o JsonResponse do Django para retornar, a partir de uma view, dados serializáveis em JSON. Por padrão, ele aceita um dicionário; também é possível passar uma lista com safe=False. Para instâncias de modelos ou um QuerySet, escolha e organize primeiro os campos que sua API deve expor. Os exemplos abaixo abrangem views baseadas em função e em classe, respostas com listas, conversão de modelos e a alternativa de nível mais baixo, HttpResponse.
Retorne um objeto JSON com o JsonResponse do Django
Um dicionário é a entrada mais comum para JsonResponse. O Django o serializa e define o tipo de conteúdo da resposta como JSON, então uma view pode retorná-lo diretamente. Veja uma estrutura de dados pequena que pode ser usada em qualquer um dos estilos de view:
Execute este exemplo:
O código e os rótulos ou saídas exibidos nesta seção permanecem em inglês.
import json
data = {"name": "Ada", "active": True}
print(json.dumps(data, separators=(",", ":")))
Saída:
{"name":"Ada","active":true}
Importe JsonResponse de django.http. Uma view baseada em função pode ser definida assim: def profile(request): return JsonResponse({"name": "Ada", "active": True}). Para uma view baseada em classe, importe também View de django.views e defina class ProfileView(View): get = lambda self, request: JsonResponse({"name": "Ada", "active": True}). Esses padrões de view específicos do Django exigem um projeto configurado; o exemplo da biblioteca padrão acima demonstra a estrutura dos dados JSON, não uma requisição ou resposta do Django.
O padrão com dicionário é útil porque favorece uma estrutura de resposta nomeada e extensível. Por exemplo, uma API pode retornar {"name": "Ada", "active": True} hoje e acrescentar outra chave depois, sem alterar o tipo do valor no nível superior. Mantenha os valores serializáveis em JSON: strings, números, valores booleanos, None, listas e dicionários são opções comuns.
Retorne uma lista JSON com JsonResponse
Uma lista também é um valor JSON válido, mas JsonResponse espera um dicionário por padrão. Defina safe=False quando o valor no nível superior for uma lista:
return JsonResponse(["Django", "Python"], safe=False)
Use esse formato quando a própria resposta for uma coleção. Se os clientes precisarem de metadados, como a quantidade de itens ou informações de paginação, retorne um dicionário que contenha a lista, por exemplo, {"items": ["Django", "Python"], "count": 2}. safe=False altera o formato permitido no nível superior; isso não torna objetos Python arbitrários serializáveis.
Converta dados de modelos e QuerySet antes de retornar JSON
Uma instância de modelo do Django e um QuerySet não são serializáveis em JSON automaticamente. Escolha os campos que devem fazer parte da resposta pública e converta cada registro em valores Python comuns antes de passar o resultado para JsonResponse. Isso também evita a exposição acidental de campos internos do modelo.
Por exemplo, uma view pode buscar um Blog e vários blogs e, em seguida, organizar os dados explicitamente:
one = Blog.objects.get(pk=1)
many = Blog.objects.all()
one_data = {"title": one.title, "likes": one.likes}
many_data = [{"title": blog.title, "likes": blog.likes} for blog in many]
return JsonResponse({"blog": one_data, "blogs": many_data})
Este é um padrão específico para organizar os dados, não uma view completa: ele pressupõe que o modelo Blog e o banco de dados estejam configurados. Se precisar incluir uma imagem, uma data, um objeto relacionado ou outro campo não primitivo, converta-o deliberadamente em uma string, um número, um valor booleano, uma lista ou um dicionário que represente o contrato da API. Para necessidades de serialização maiores ou mais complexas, os serializadores do Django são outra opção; consulte a documentação de serialização do Django.
Crie JSON manualmente com HttpResponse
Use HttpResponse quando precisar controlar por conta própria a etapa de serialização. Importe json e HttpResponse, codifique um valor Python compatível com JSON usando json.dumps e defina content_type como application/json:
import json
from django.http import HttpResponse
return HttpResponse(json.dumps({"name": "Ada"}), content_type="application/json")
Essa alternativa de nível mais baixo produz uma resposta JSON quando o valor fornecido pode ser codificado. Para dicionários e listas comuns, JsonResponse costuma ser mais claro, pois cuida da codificação JSON e do tipo de conteúdo. Assim como com JsonResponse, converta primeiro instâncias de modelos e resultados de QuerySet em uma estrutura explicitamente compatível com JSON.