Converter um QuerySet em JSON no Django
-
Converta um
QuerySet
em umJSON
usando um método personalizado -
Converta um
QuerySet
para umJSON
usando os serializadores internos do Django -
Converta um
QuerySet
para umJSON
usando 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")