La méthode .values()
de Django permet de sélectionner et de renvoyer uniquement certains champs lors de l'exécution d'un QuerySet. En utilisant cette méthode, les résultats sont renvoyés sous forme de liste de dictionnaires, ce qui permet de récupérer uniquement les champs spécifiés, et non tous les champs du modèle.
📌 Caractéristiques principales :
- Un QuerySet classique (
Model.objects.all()
) renvoie une liste d'objets (instances de modèle), mais,- lorsque
.values()
est utilisé, un liste de dictionnaires est renvoyée.
🛠 1. Utilisation de base
from myapp.models import Post
# QuerySet classique (renvoie les instances de modèle avec tous les champs)
posts = Post.objects.all()
print(posts)
# , ]>
# Utilisation de .values() (ne renvoie que les champs title et author)
posts = Post.objects.values('title', 'author')
print(posts)
#
📌 Différences :
Post.objects.all()
→ Renvoie une liste d'instances du modèle PostPost.objects.values('title', 'author')
→ Renvoie une liste de dictionnaires
🛠 2. Optimisation des performances de .values()
En utilisant .values()
, vous pouvez éviter de charger des champs inutiles, ce qui améliore les performances des requêtes. Cela signifie que comme seules les champs nécessaires sont récupérés, la charge sur la base de données est réduite.
# Récupération de tous les objets modèles (inefficace)
Post.objects.all()
# Récupération uniquement des champs nécessaires (efficace)
Post.objects.values('title', 'author')
🛠 3. Différence entre .values()
et .values_list()
✅ .values()
→ Renvoie une liste de dictionnaires
Post.objects.values('id', 'title')
# <QuerySet [{'id': 1, 'title': 'Premier article'}, {'id': 2, 'title': 'Deuxième article'}]>
✅ .values_list()
→ Renvoie une liste de tuples
Post.objects.values_list('id', 'title')
# <QuerySet [(1, 'Premier article'), (2, 'Deuxième article')]>
🛠 4. Utilisation conjointe de .values()
et annotate()
Utiliser annotate()
avec .values()
permet de récupérer des données agrégées sous forme de dictionnaires.
from django.db.models import Count
from myapp.models import Post, Comment
# Récupérer le nombre de commentaires pour chaque article
Post.objects.values('title').annotate(comment_count=Count('comments'))
🛠 5. Filtrage avec .values()
(utilisation conjointe avec distinct()
)
Exemple : Récupérer les titres de tous les articles écrits par un author
spécifique, tout en éliminant les doublons :
Post.objects.values('title').filter(author=1).distinct()
📌 Conclusion
- ✅
.values()
transforme le QuerySet en liste de dictionnaires, ne récupérant que les champs spécifiés. - ✅ Possibilité d'optimiser les performances des requêtes en excluant des champs inutiles.
- ✅ Comparé à
.values_list()
,.values()
renvoie des dictionnaires, tandis que.values_list()
renvoie des tuples. - ✅ Possibilité d'obtenir des données agrégées sous forme de dictionnaires en utilisant
.annotate()
. - ✅ Possibilité d'éliminer les doublons en utilisant
.distinct()
.
💡 La méthode .values()
est un puissant outil pour optimiser les performances en réduisant les champs inutiles lors de la récupération des données ! 🚀 En fonction des objectifs, il est très utile de récupérer les données sous forme de dictionnaires plutôt qu'en objets modèle ! 😊
Ah ! En voyant les résultats de l'exemple ci-dessus, certains d'entre vous l'ont peut-être déjà remarqué, mais les listes de dictionnaires renvoyées par .values() et .values_list() sont toujours des QuerySet. (Comme elles sont évaluées de manière différée, si vous avez besoin d'une évaluation immédiate, veuillez les entourer de list() !)
Add a New Comment