¿Cómo puedo convertir un Django QuerySet en una lista de dictados? No he encontrado una respuesta a esto, así que me pregunto si me falta algún tipo de función auxiliar común que todos usan.
¿Cómo puedo convertir un Django QuerySet en una lista de dictados? No he encontrado una respuesta a esto, así que me pregunto si me falta algún tipo de función auxiliar común que todos usan.
Respuestas:
Usa el .values()
método:
>>> Blog.objects.values()
[{'id': 1, 'name': 'Beatles Blog', 'tagline': 'All the latest Beatles news.'}],
>>> Blog.objects.values('id', 'name')
[{'id': 1, 'name': 'Beatles Blog'}]
Nota: el resultado es un QuerySet
que se comporta principalmente como una lista, pero en realidad no es una instancia de list
. Úselo list(Blog.objects.values(…))
si realmente necesita una instancia de list
.
values()
, no sé si hay un buen método para hacer lo mismo values()
pero también para llamar a los métodos de instancia.
El .values()
método le devolverá un resultado de tipo ValuesQuerySet
que normalmente es lo que necesita en la mayoría de los casos.
Pero si lo desea, puede convertirlo ValuesQuerySet
en una lista nativa de Python usando la comprensión de la lista de Python como se ilustra en el siguiente ejemplo.
result = Blog.objects.values() # return ValuesQuerySet object
list_result = [entry for entry in result] # converts ValuesQuerySet into Python list
return list_result
Me parece que el anterior ayuda si está escribiendo pruebas unitarias y necesidad de afirmar que el valor de retorno esperado de una función coincide con el valor de retorno real, en cuyo caso tanto expected_result
y actual_result
deben ser del mismo tipo (por ejemplo, el diccionario).
actual_result = some_function()
expected_result = {
# dictionary content here ...
}
assert expected_result == actual_result
list(result)
Si necesita tipos de datos nativos por alguna razón (por ejemplo, serialización JSON), esta es mi forma rápida y sucia de hacerlo:
data = [{'id': blog.pk, 'name': blog.name} for blog in blogs]
Como puede ver, construir el dict dentro de la lista no es realmente SECO, por lo que si alguien conoce una manera mejor ...
data = list( blogs )
y luego json.dumps( data )
. Aparece una matriz con un montón de objetos en el lado de JavaScript, sin necesidad de análisis.
No define exactamente cómo deberían verse los diccionarios, pero lo más probable es que se esté refiriendo QuerySet.values()
. De la documentación oficial de django :
Devuelve una
ValuesQuerySet
: unaQuerySet
subclase que devuelve diccionarios cuando se usa como iterable, en lugar de objetos de instancia de modelo.Cada uno de esos diccionarios representa un objeto, con las claves correspondientes a los nombres de los atributos de los objetos modelo.
Escriba Cast to List
job_reports = JobReport.objects.filter(job_id=job_id, status=1).values('id', 'name')
json.dumps(list(job_reports))
Puede usar el values()
método en el diccionario que obtuvo del campo del modelo de Django en el que realiza las consultas y luego puede acceder fácilmente a cada campo mediante un valor de índice.
Llámalo así -
myList = dictOfSomeData.values()
itemNumberThree = myList[2] #If there's a value in that index off course...
Lo que necesita DjangoJSONEncoder
y list
para que su Queryset
a json
, ref: Python JSON serializar un objeto decimal
import json
from django.core.serializers.json import DjangoJSONEncoder
blog = Blog.objects.all().values()
json.dumps(list(blog), cls=DjangoJSONEncoder)
En pocas palabras list(yourQuerySet)
.
values()
devolver pasándolos como argumentos. También tenga cuidado, aunque parece que los valores devuelven una lista de dictados, en realidad es una<class 'django.db.models.query.ValuesQuerySet'>
y no una lista.