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.