2011-10-18 27 views

Respuesta

74

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 no es realmente una instancia de list. Use list(Blog.objects.values(…)) si realmente necesita una instancia de list.

+4

sí, usted especifica qué campos quiere que 'values ​​()' devuelva pasándolos como argumentos. También tenga cuidado, aunque parezca que values ​​devuelve una lista de dicts, en realidad es una '' y no una lista. – dm03514

+1

esto en realidad no devuelve una lista aunque – astreltsov

+0

¡Gracias! Actualizado. –

2

No define exactamente cómo deberían ser los diccionarios, pero lo más probable es que se refiera a QuerySet.values(). Desde el official django documentation:

Devuelve una ValuesQuerySet - una subclase QuerySet que devuelve diccionarios cuando se utiliza como iterable, en vez de modelo de instancia objetos.

Cada uno de esos diccionarios representa un objeto, con las claves correspondientes a los nombres de los atributos de los objetos del modelo.

14

El método .values() le devolverá un resultado del tipo ValuesQuerySet que generalmente es lo que necesita en la mayoría de los casos.

Pero si lo desea, puede convertir ValuesQuerySet en una lista nativa de Python utilizando 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 

encuentro la anterior ayuda si está escribiendo pruebas de unidad y la 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, diccionario).

actual_result = some_function() 
expected_result = { 
    # dictionary content here ... 
} 
assert expected_result == actual_result 
+5

O puede simplificar la conversión a la lista con esta 'lista (resultado)' –

0

Usted puede utilizar el método values() en el dict que tienes desde el campo de modelo de Django a tomar las consultas sobre y luego se puede acceder fácilmente a cada campo por un valor de índice.

llamada como este -

myList = dictOfSomeData.values() 
itemNumberThree = myList[2] #If there's a value in that index off course... 
2

Si necesita tipos de datos nativos por alguna razón (por ejemplo, la serialización JSON) este es mi 'n' manera sucia y rápida de hacerlo:

data = [{'id': blog.pk, 'name': blog.name} for blog in blogs] 

Como puede ver, la construcción del dict dentro de la lista no es realmente DRY así que si alguien conoce una mejor manera ...

Cuestiones relacionadas