Convertir un QuerySet a JSON en Django
-
Convierta un
QuerySet
en unJSON
utilizando un método personalizado -
Convierta un
QuerySet
en unJSON
utilizando los serializadores integrados de Django -
Convierta un
QuerySet
en unJSON
utilizando la funciónvalues()
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")