Comment puis-je convertir un Django QuerySet en une liste de dicts? Je n'ai pas trouvé de réponse à cette question, alors je me demande s'il me manque une sorte de fonction d'aide courante utilisée par tout le monde.
Utilisez la méthode .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'}]
Remarque: le résultat est une QuerySet
qui se comporte généralement comme une liste, mais qui n'est pas une instance de list
. Utilisez list(Blog.objects.values(…))
si vous avez vraiment besoin d'une instance de list
.
La méthode .values()
vous renverra un résultat de type ValuesQuerySet
qui correspond généralement à ce dont vous avez besoin dans la plupart des cas.
Mais si vous le souhaitez, vous pouvez transformer ValuesQuerySet
en une liste Python native à l'aide de la compréhension de la liste Python, comme illustré dans l'exemple ci-dessous.
result = Blog.objects.values() # return ValuesQuerySet object
list_result = [entry for entry in result] # converts ValuesQuerySet into Python list
return list_result
Je trouve que ce qui précède vous aide si vous écrivez des tests unitaires et que vous devez affirmer que la valeur de retour attendue d’une fonction correspond à la valeur de retour réelle, auquel cas expected_result
et actual_result
doivent être du même type (dictionnaire, par exemple).
actual_result = some_function()
expected_result = {
# dictionary content here ...
}
assert expected_result == actual_result
Si vous avez besoin de types de données natifs pour une raison quelconque (par exemple, la sérialisation JSON), voici ma façon rapide de procéder:
data = [{'id': blog.pk, 'name': blog.name} for blog in blogs]
Comme vous pouvez le constater, la construction du dict dans la liste n’est pas vraiment DRY, alors si quelqu'un connaît un meilleur moyen ...
Vous ne définissez pas exactement à quoi devraient ressembler les dictionnaires, mais vous faites probablement référence à QuerySet.values()
. Dans la documentation officielle de Django :
Renvoie une
ValuesQuerySet
- une sous-classeQuerySet
qui retourne dictionnaires utilisés comme itérables, plutôt que comme exemples de modèles objets.Chacun de ces dictionnaires représente un objet, avec les clés correspondant aux noms d'attributs des objets du modèle.
Type Cast to List
job_reports = JobReport.objects.filter(job_id=job_id, status=1)..values('id', 'name')
json.dumps(list(job_reports))
Il faut DjangoJSONEncoder
et list
pour que votre Queryset
devienne json
, ref: Python JSON sérialisera un objet Decimal.
import json
from Django.core.serializers.json import DjangoJSONEncoder
blog = Blog.objects.all().values()
json.dumps(list(blog), cls=DjangoJSONEncoder)
Vous pouvez utiliser la méthode values()
sur le dict obtenu dans le champ de modèle Django sur lequel vous effectuez les requêtes, puis vous pouvez facilement accéder à chaque champ par une valeur d'index.
Appelez ça comme ça -
myList = dictOfSomeData.values()
itemNumberThree = myList[2] #If there's a value in that index off course...
Il suffit de mettre list(yourQuerySet)
.