Converter um QuerySet em JSON no Django

Vaibhav Vaibhav 30 janeiro 2023
  1. Converta um QuerySet em um JSON usando um método personalizado
  2. Converta um QuerySet para um JSON usando os serializadores internos do Django
  3. Converta um QuerySet para um JSON usando a função values()
Converter um QuerySet em JSON no Django

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")
Vaibhav Vaibhav avatar Vaibhav Vaibhav avatar

Vaibhav is an artificial intelligence and cloud computing stan. He likes to build end-to-end full-stack web and mobile applications. Besides computer science and technology, he loves playing cricket and badminton, going on bike rides, and doodling.