Come posso convertire un Django QuerySet in un elenco di dict? Non ho trovato una risposta a questo, quindi mi chiedo se mi manca una sorta di funzione di aiuto comune che tutti usano.
Come posso convertire un Django QuerySet in un elenco di dict? Non ho trovato una risposta a questo, quindi mi chiedo se mi manca una sorta di funzione di aiuto comune che tutti usano.
Risposte:
Usa il .values()metodo:
>>> 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 QuerySetche si comporta principalmente come un elenco, ma in realtà non è un'istanza di list. Usa list(Blog.objects.values(…))se hai davvero bisogno di un'istanza di list.
values(), non so se esiste un buon metodo per fare lo stesso values()ma anche chiamando i metodi di istanza ?!
Il .values()metodo restituirà un risultato di tipo ValuesQuerySetche è in genere ciò di cui hai bisogno nella maggior parte dei casi.
Ma se lo desideri, puoi trasformarti ValuesQuerySetin un elenco Python nativo utilizzando la comprensione dell'elenco 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 che quanto sopra aiuta se stai scrivendo unit test e hai bisogno di affermare che il valore di ritorno atteso di una funzione corrisponde al valore di ritorno effettivo, nel qual caso entrambi expected_resulte actual_resultdevono essere dello stesso tipo (ad esempio dizionario).
actual_result = some_function()
expected_result = {
# dictionary content here ...
}
assert expected_result == actual_result
list(result)
Se hai bisogno di tipi di dati nativi per qualche motivo (ad esempio serializzazione JSON) questo è il mio modo rapido e sporco per farlo:
data = [{'id': blog.pk, 'name': blog.name} for blog in blogs]
Come puoi vedere la costruzione del dict all'interno dell'elenco non è propriamente ASCIUTTA, quindi se qualcuno conosce un modo migliore ...
data = list( blogs )e poi json.dumps( data ). Un array esce con un mucchio di oggetti sul lato javascript, nessuna analisi necessaria.
Non definisci esattamente come dovrebbero apparire i dizionari, ma molto probabilmente ti riferisci QuerySet.values(). Dalla documentazione ufficiale di Django :
Restituisce a
ValuesQuerySet- unaQuerySetsottoclasse che restituisce dizionari quando viene utilizzata come oggetti iterabili, piuttosto che come oggetti di istanza del modello.Ciascuno di questi dizionari rappresenta un oggetto, con le chiavi corrispondenti ai nomi degli attributi degli oggetti del modello.
Digita Trasmetti a elenco
job_reports = JobReport.objects.filter(job_id=job_id, status=1).values('id', 'name')
json.dumps(list(job_reports))
Puoi utilizzare il values()metodo sul dict ottenuto dal campo del modello Django su cui effettui le query e quindi puoi accedere facilmente a ciascun campo tramite un valore di indice.
Chiamalo così -
myList = dictOfSomeData.values()
itemNumberThree = myList[2] #If there's a value in that index off course...
È necessario DjangoJSONEncodere listper rendere il vostro Queryseta json, ref: Python JSON serializzare un oggetto decimale
import json
from django.core.serializers.json import DjangoJSONEncoder
blog = Blog.objects.all().values()
json.dumps(list(blog), cls=DjangoJSONEncoder)
In poche parole list(yourQuerySet).
values()restituire passandoli come argomenti. Fai anche attenzione anche se sembra che i valori restituiscano un elenco di dict in realtà è un<class 'django.db.models.query.ValuesQuerySet'>e non un elenco.