Converter um QuerySet em JSON no Django
-
Converta um
QuerySetem umJSONusando um método personalizado -
Converta um
QuerySetpara umJSONusando os serializadores internos do Django -
Converta um
QuerySetpara umJSONusando a funçãovalues()
No Django, todos os gerenciadores de modelo retornam um QuerySet quando alguma consulta é aplicada sobre um modelo. Um QuerySet pode ser facilmente usado na linguagem de templates do Python e Django. Podemos realizar muitas ações em um QuerySet para buscar os resultados ou registros desejados. Mas um QuerySet tem uma desvantagem: eles não são serializáveis JSON.
Além de aplicações web, Django também é usado para fazer APIs, e em APIs, JSON é essencial porque os dados viajam em um formato JSON entre o servidor e o cliente.
Embora não seja possível converter diretamente um QuerySet em JSON, podemos usar um QuerySet para criar um objeto Python ou um JSON stringificado. Existem algumas maneiras de conseguir isso. Este artigo irá discutir algumas das melhores maneiras de converter um QuerySet em um JSON.
Converta um QuerySet em um JSON usando um método personalizado
Suponha que temos um modelo Django como segue. Podemos escrever uma função que aceitará um objeto deste modelo e retornará uma representação de dicionário do objeto.
from django.db import models
class Person(models.Model):
username = models.CharField(max_length=200, unique=True)
firstName = models.CharField(max_length=200)
middleName = models.CharField(max_length=200)
lastName = models.CharField(max_length=200)
age = models.IntegerField(default=0)
E o método para lidar com a conversão é o seguinte.
def personToDictionary(person):
if person == None:
return None
dictionary = {}
dictionary["username"] = person.username
dictionary["firstName"] = person.firstName
dictionary["middleName"] = person.middleName
dictionary["lastName"] = person.lastName
dictionary["age"] = person.age
return dictionary
person = Person.objects.get(id=25)
personDictionary = personToDictionary(person)
Essa abordagem nos dá mais controle sobre os dados que desejamos incluir na representação do dicionário. Por exemplo, se tivéssemos chaves estrangeiras, poderíamos incluir várias informações dos modelos referenciados. Também podemos realizar alguns cálculos e incluí-los no dicionário.
Converta um QuerySet para um JSON usando os serializadores internos do Django
Django tem serializadores embutidos que podem ser usados para converter modelos para a forma desejada. Pode-se transformar um modelo em um formato JSON, XML, JSONL e YAML usando serializadores. Alguns dos formatos requerem algumas bibliotecas Python adicionais para funcionar.
Suponha que tenhamos que converter o modelo Person acima para um formato JSON. Para fazer isso, faríamos o seguinte.
from django.core import serializers
person = serializers.serialize("json", Person.objects.get(id=25))
people = serializers.serialize("json", Person.objects.all())
Um serializador pode converter um único modelo, bem como um QuerySet. A person e a variável people agora conterão os dados em um formato JSON.
Digamos que tenhamos que converter apenas os campos de nome do modelo. Para isso, faríamos o seguinte.
from django.core import serializers
person = serializers.serialize(
"json", Person.objects.get(id=25), fields=("firstName", "middleName", "lastName")
)
people = serializers.serialize(
"json", Person.objects.all(), fields=("firstName", "middleName", "lastName")
)
Temos que definir o parâmetro fields para uma tupla de nomes de campo do modelo. Um ponto importante a observar aqui é que a chave primária, o id, é sempre serializada, quer você mencione ou não.
Para aprender mais sobre serializadores, consulte a documentação oficial do Django aqui.
Converta um QuerySet para um JSON usando a função values()
A terceira abordagem usa o método values() que pode ser chamado em um QuerySet. Um QuerySet retorna um conjunto de instâncias de modelo, enquanto o método values() retorna um conjunto de dicionários que representam instâncias de modelo.
Consulte o código a seguir.
person = Person.objects.filter(age=25).values()
people = Person.objects.all().values()
Por padrão, um dicionário contém todos os campos da tabela. Se tivermos que limitar os campos, podemos usar os argumentos posicionais opcionais, *fields, neste método. Consulte o seguinte trecho de código.
person = Person.objects.filter(age=25).values("id", "age", "firstName", "lastName")
people = Person.objects.all().values("id", "firstName")
