python - queryset - django subquery
¿Cómo convierto un Django QuerySet en una lista de dictados? (5)
El método .values()
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 convertir 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
Creo que lo anterior es de ayuda si está escribiendo pruebas unitarias y necesita afirmar que el valor de retorno esperado de una función coincide con el valor de retorno real, en cuyo caso tanto el valor expected_result
como el resultado 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
¿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 estoy perdiendo algún tipo de función de ayuda común que todos usan.
No define exactamente cómo deberían ser los diccionarios, pero lo más probable es que se refiera a QuerySet.values()
. De la .values() :
Devuelve un
ValuesQuerySet
: una subclase deQuerySet
que devuelve diccionarios cuando se utiliza como un objeto 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 atributo de los objetos modelo.
Puede usar el método de values()
en el dictado del campo del modelo de Django en el que realiza las consultas y luego puede acceder fácilmente a cada campo por un valor de índice.
Llámalo así.
myList = dictOfSomeData.values()
itemNumberThree = myList[2] #If there''s a value in that index off course...
Si necesita tipos de datos nativos por algún motivo (p. Ej., Serialización JSON) esta es mi forma rápida y rápida de hacerlo:
data = [{''id'': blog.pk, ''name'': blog.name} for blog in blogs]
Como se puede ver, construir el dictado dentro de la lista no es realmente SECO, por lo que si alguien conoce una forma mejor ...
Utilice el método .values()
:
>>> 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 en su mayoría se comporta como una lista, pero en realidad no es una instancia de la list
. Use list(Blog.objects.values(…))
si realmente necesita una instancia de list
.