¿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.
122
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()
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.values()
, no sé si hay un buen método para hacer lo mismovalues()
pero también para llamar a los métodos de instancia.El
.values()
método le devolverá un resultado de tipoValuesQuerySet
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.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
yactual_result
deben ser del mismo tipo (por ejemplo, el diccionario).fuente
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:
Como puede ver, construir el dict dentro de la lista no es realmente SECO, por lo que si alguien conoce una manera mejor ...
fuente
data = list( blogs )
y luegojson.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 :fuente
Escriba Cast to List
fuente
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í -
fuente
Lo que necesita
DjangoJSONEncoder
ylist
para que suQueryset
ajson
, ref: Python JSON serializar un objeto decimalfuente
En pocas palabras
list(yourQuerySet)
.fuente
Puede definir una función usando model_to_dict de la siguiente manera:
fuente