Comment puis-je convertir un Django QuerySet en une liste de dictionnaires? Je n'ai pas trouvé de réponse à cela, alors je me demande s'il me manque une sorte de fonction d'assistance commune que tout le monde utilise.
Comment puis-je convertir un Django QuerySet en une liste de dictionnaires? Je n'ai pas trouvé de réponse à cela, alors je me demande s'il me manque une sorte de fonction d'assistance commune que tout le monde utilise.
Réponses:
Utilisez la .values()
méthode:
>>> 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 un QuerySet
qui se comporte principalement comme une liste, mais n'est pas en fait une instance de list
. À utiliser list(Blog.objects.values(…))
si vous avez vraiment besoin d'une instance de list
.
values()
, je ne sais pas s'il existe une bonne méthode pour faire la même chose que values()
mais aussi avec l'appel des méthodes d'instance?!
La .values()
méthode vous renverra un résultat de type ValuesQuerySet
qui est généralement ce dont vous avez besoin dans la plupart des cas.
Mais si vous le souhaitez, vous pouvez vous transformer ValuesQuerySet
en une liste Python native en utilisant la compréhension de 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 aide si vous écrivez des tests unitaires et devez affirmer que la valeur de retour attendue d'une fonction correspond à la valeur de retour réelle, auquel cas les deux expected_result
et actual_result
doivent être du même type (par exemple, dictionnaire).
actual_result = some_function()
expected_result = {
# dictionary content here ...
}
assert expected_result == actual_result
list(result)
Si vous avez besoin de types de données natifs pour une raison quelconque (par exemple, la sérialisation JSON), c'est ma façon rapide et sale de le faire:
data = [{'id': blog.pk, 'name': blog.name} for blog in blogs]
Comme vous pouvez le voir, construire le dict à l'intérieur de la liste n'est pas vraiment SEC, donc si quelqu'un connaît un meilleur moyen ...
data = list( blogs )
et ensuite json.dumps( data )
. Un tableau sort avec un tas d'objets du côté javascript, aucune analyse nécessaire.
Vous ne définissez pas exactement à quoi devraient ressembler les dictionnaires, mais vous faites très probablement référence QuerySet.values()
. De la documentation officielle de django :
Renvoie a
ValuesQuerySet
- uneQuerySet
sous-classe qui renvoie des dictionnaires lorsqu'elle est utilisée comme une itération, plutôt que comme des objets d'instance de modèle.Chacun de ces dictionnaires représente un objet, les clés correspondant aux noms d'attributs des objets modèles.
Tapez Cast to List
job_reports = JobReport.objects.filter(job_id=job_id, status=1).values('id', 'name')
json.dumps(list(job_reports))
Vous pouvez utiliser la values()
méthode sur le dict que vous avez obtenu à partir du 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...
Vous avez besoin DjangoJSONEncoder
et list
pour rendre votre Queryset
to json
, ref: Python JSON sérialise un objet Decimal
import json
from django.core.serializers.json import DjangoJSONEncoder
blog = Blog.objects.all().values()
json.dumps(list(blog), cls=DjangoJSONEncoder)
En termes simples list(yourQuerySet)
.
values()
renvoyer en les transmettant comme arguments. Faites également attention bien que cela ressemble à des valeurs qui renvoie une liste de dictionnaires, c'est en fait un a<class 'django.db.models.query.ValuesQuerySet'>
et non une liste.