The .values() method in Django provides the functionality to select and return specific fields when executing a QuerySet. By using this method, the results are returned in the form of a list of dictionaries, allowing you to fetch only the specified fields instead of all model fields.
📌 Key Features:
- A standard QuerySet (
Model.objects.all()) returns a list of objects (Model instances), while- using
.values()returns a list of dictionaries (dict list).
🛠 1. Basic Usage
from myapp.models import Post
# Existing QuerySet (returns model instances including all fields)
posts = Post.objects.all()
print(posts)
# , ]>
# Using .values() (fetches only title and author fields)
posts = Post.objects.values('title', 'author')
print(posts)
#
📌 Differences:
Post.objects.all()→ returns a list of Post model instancesPost.objects.values('title', 'author')→ returns a list of dictionaries (dict list)
🛠 2. Performance Optimization of .values()
Using .values() can prevent unnecessary field loading and enhance query performance. In other words, fetching only the necessary fields reduces the database load.
# Fetching entire model objects (inefficient)
Post.objects.all()
# Fetching only necessary fields (efficient)
Post.objects.values('title', 'author')
🛠 3. Differences Between .values() and .values_list()
✅ .values() → returns a list of dictionaries (dict list)
Post.objects.values('id', 'title')
# <QuerySet [{'id': 1, 'title': 'First Post'}, {'id': 2, 'title': 'Second Post'}]>
✅ .values_list() → returns a list of tuples (tuple list)
Post.objects.values_list('id', 'title')
# <QuerySet [(1, 'First Post'), (2, 'Second Post')]>
🛠 4. Using .values() with annotate()
Using annotate() with .values() lets you retrieve aggregated data in dictionary form.
from django.db.models import Count
from myapp.models import Post, Comment
# Fetching comment counts for each post
Post.objects.values('title').annotate(comment_count=Count('comments'))
🛠 5. Filtering with .values() (used with distinct())
Example: To fetch the titles of all posts written by a specific author, while removing duplicates:
Post.objects.values('title').filter(author=1).distinct()
📌 Conclusion
- ✅
.values()converts the QuerySet to a list of dictionaries (dict list), fetching only specific fields. - ✅ Allows for query performance optimization by excluding unnecessary fields.
- ✅ Compared to
.values_list(),.values()returns dictionaries, while.values_list()returns tuples. - ✅ Can be used with
.annotate()to bring aggregated data in dictionary form. - ✅ Can be used with
.distinct()to remove duplicates.
💡 .values() is a powerful feature that optimizes performance by reducing unnecessary fields during data retrieval! 🚀 It is very useful for fetching data as dictionaries instead of model objects based on usage. 😊

Ah! You might have already noticed from the example results above, but the lists of dictionaries returned by .value() and .value_list() are still QuerySets. (Since they are lazily evaluated, those who need immediate evaluation should wrap them with list()!)
There are no comments.