web-dev-qa-db-fra.com

Comment convertir un Django QuerySet en liste de dict?

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.

81
Mridang Agarwalla

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.

116
David Wolever

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
22
Arthur Rimbun

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 ...

7
Semmel

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-classe QuerySet 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.

3
Bernhard Vallant

Type Cast to List

    job_reports = JobReport.objects.filter(job_id=job_id, status=1)..values('id', 'name')

    json.dumps(list(job_reports))
1

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)
0
gaozhidf

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...
0
Ido Magor

Il suffit de mettre list(yourQuerySet).

0
Miguel Matos