2011-10-18 10 views

risposta

74

utilizzare il metodo .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: il risultato è un QuerySet che si comporta in gran parte come una lista, ma in realtà non è un caso di list. Usa list(Blog.objects.values(…)) se hai davvero bisogno di un'istanza di list.

+4

sì specifichi quali campi vuoi 'valori()' per restituirli passandoli come argomenti. Fai attenzione anche se sembra che i valori restituiscano una lista di dicts in realtà un '' e non una lista. – dm03514

+1

questo in realtà non restituisce un elenco se – astreltsov

+0

Grazie! Aggiornato. –

2

Non si definisce esattamente come dovrebbe apparire il dizionario, ma molto probabilmente si fa riferimento a QuerySet.values(). Dal official django documentation:

Restituisce una ValuesQuerySet - una sottoclasse QuerySet che restituisce dizionari quando viene utilizzato come un iterabile, piuttosto che il modello-esempio oggetti.

Ciascuno di questi dizionari rappresenta un oggetto, con i tasti corrispondenti ai nomi degli attributi degli oggetti del modello.

14

Il metodo .values() restituirà un risultato di tipo ValuesQuerySet che in genere è quello che ti serve nella maggior parte dei casi.

Ma se lo si desidera, è possibile trasformare ValuesQuerySet in un elenco Python nativo utilizzando la comprensione degli elenchi Python come illustrato nell'esempio seguente.

result = Blog.objects.values()    # return ValuesQuerySet object 
list_result = [entry for entry in result] # converts ValuesQuerySet into Python list 
return list_result 

Trovo quanto sopra aiuta se si sta scrivendo unit test e la necessità di affermare che il valore di ritorno atteso di una funzione corrisponde al valore di rendimento effettivo, in questo caso sia expected_result e actual_result devono essere dello stesso tipo (es. dizionario).

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

Oppure puoi semplificare la conversione in lista con questo 'elenco (risultato)' –

0

È possibile utilizzare il metodo values() sul dict avete ottenuto dal campo Modello Django si fanno le query su e poi si può facilmente accedere a ogni campo da un valore di indice.

chiamare in questo modo -

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

Se avete bisogno di tipi di dati nativi per qualche motivo (ad esempio JSON serializzazione) questo è il mio veloce 'n' modo sporco per farlo:

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

Come puoi vedere, la dict all'interno della lista non è ESSENZIALE, quindi se qualcuno conosce un modo migliore ...

Problemi correlati