Convertir un QuerySet a JSON en Django

Vaibhav Vaibhav 30 enero 2023
  1. Convierta un QuerySet en un JSON utilizando un método personalizado
  2. Convierta un QuerySet en un JSON utilizando los serializadores integrados de Django
  3. Convierta un QuerySet en un JSON utilizando la función values()
Convertir un QuerySet a JSON en Django

En Django, todos los administradores de modelos devuelven un QuerySet cuando se aplica alguna consulta sobre un modelo. Un QuerySet se puede usar fácilmente en el lenguaje de plantillas de Python y Django. Podemos realizar muchas acciones sobre un QuerySet para obtener los resultados o registros deseados. Pero un QuerySet tiene un inconveniente: no son serializables en JSON.

Aparte de las aplicaciones web, Django también se utiliza para hacer API, y en las API, JSON es esencial porque los datos viajan en formato JSON entre el servidor y el cliente.

Aunque no es directamente posible convertir un QuerySet a JSON, podemos usar un QuerySet para crear un objeto Python o un JSON en cadena. Hay un par de formas de lograrlo. Este artículo discutirá algunas de las mejores formas de convertir un QuerySet en un JSON.

Convierta un QuerySet en un JSON utilizando un método personalizado

Supongamos que tenemos un modelo de Django como sigue. Podemos escribir una función que acepte un objeto de este modelo y devuelva una representación de diccionario del 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)

Y el método para manejar la conversión es el siguiente.

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)

Este enfoque nos da más control sobre los datos que deseamos incluir en la representación del diccionario. Por ejemplo, si tuviéramos claves externas, podríamos incluir información diversa de los modelos referenciados. También podemos realizar algunos cálculos e incluirlos en el diccionario.

Convierta un QuerySet en un JSON utilizando los serializadores integrados de Django

Django tiene serializadores integrados que se pueden usar para convertir modelos a la forma deseada. Se puede transformar un modelo a formato JSON, XML, JSONL y YAML utilizando serializadores. Algunos de los formatos requieren algunas bibliotecas de Python adicionales para funcionar.

Supongamos que tenemos que convertir el modelo Person anterior a un formato JSON. Para hacerlo, haríamos lo siguiente.

from django.core import serializers

person = serializers.serialize("json", Person.objects.get(id=25))
people = serializers.serialize("json", Person.objects.all())

Un serializador puede convertir un solo modelo así como un QuerySet. Las variables person y people ahora contendrán los datos en formato JSON.

Digamos que solo tenemos que convertir los campos de nombre del modelo. Para lograrlo, haríamos lo siguiente.

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

Tenemos que establecer el parámetro campos en una tupla de nombres de campo del modelo. Un punto clave a tener en cuenta aquí es que la clave principal, el id, siempre se serializa, lo mencione o no.

Para obtener más información sobre los serializadores, consulte la documentación oficial de Django aquí.

Convierta un QuerySet en un JSON utilizando la función values()

El tercer enfoque utiliza el método values() que se puede llamar a través de un QuerySet. Un QuerySet devuelve un conjunto de instancias de modelo, mientras que el método values() devuelve un conjunto de diccionarios que representan instancias de modelo.

Consulte el siguiente código.

person = Person.objects.filter(age=25).values()
people = Person.objects.all().values()

De forma predeterminada, un diccionario contiene todos los campos de la tabla. Si tenemos que limitar los campos, podemos usar los argumentos posicionales opcionales, *fields, en este método. Consulte el siguiente fragmento 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.