Django的 .values() 方法具有 在執行QuerySet時僅選擇特定字段返回的功能。使用此方法,結果將以 字典列表(list of dictionaries)的形式返回,並且只取得指定的字段,而不是所有模型字段。
📌 主要特點:
- 一般的QuerySet(
Model.objects.all())將返回對象(Model實例)列表,但是,.values()使用時 將返回字典列表(dict list)。
🛠 1. 基本用法
from myapp.models import Post
# 獲取完整的QuerySet(返回包含所有字段的模型實例)
posts = Post.objects.all()
print(posts)
# , ]>
# 使用 .values() (僅獲取title和author字段)
posts = Post.objects.values('title', 'author')
print(posts)
#
📌 差異:
Post.objects.all()→ 返回Post模型的實例列表Post.objects.values('title', 'author')→ 返回字典(dict)列表
🛠 2. .values()的性能優化
.values()的使用可以防止不必要的字段加載,從而提高查詢性能。也就是說,僅獲取需要的字段,減少數據庫負擔。
# 獲取所有模型對象(效率低下)
Post.objects.all()
# 僅獲取需要的字段(效率高)
Post.objects.values('title', 'author')
🛠 3. .values() 和 .values_list() 的區別
✅ .values() → 返回字典(dict)列表
Post.objects.values('id', 'title')
# <QuerySet [{'id': 1, 'title': '第一篇文章'}, {'id': 2, 'title': '第二篇文章'}]>
✅ .values_list() → 返回元組(tuple)列表
Post.objects.values_list('id', 'title')
# <QuerySet [(1, '第一篇文章'), (2, '第二篇文章')]>
🛠 4. 結合使用 .values() 和 annotate()
結合使用 annotate() 和 .values(),可以以字典形式獲取聚合(aggregation)數據。
from django.db.models import Count
from myapp.models import Post, Comment
# 獲取每篇文章(post)的評論數量
Post.objects.values('title').annotate(comment_count=Count('comments'))
🛠 5. 使用 .values() 進行過濾(結合使用 distinct())
示例:獲取特定 author 所寫的所有文章標題,但去除重複的情況:
Post.objects.values('title').filter(author=1).distinct()
📌 結論
- ✅
.values()將QuerySet轉換為字典(dict)列表以僅獲取特定字段。 - ✅ 可以排除不必要的字段以優化查詢性能。
- ✅ 與
.values_list()相比,.values()返回字典,而.values_list()返回元組。 - ✅ 可以與
.annotate()結合使用,以字典形式獲取聚合數據。 - ✅ 可以與
.distinct()結合使用以去除重複。
💡 .values() 是一個強大的功能,可以在數據查詢時減少不必要的字段以優化性能!🚀 根據目的,在需要以字典形式獲取數據而不是模型對象時,十分有用 😊

啊!從上面的示例結果中,您可能已經注意到了,通過 .value() 和 .value_list() 返回的字典列表仍然是查詢集。 (由於是延遲評估,所以如果需要立即評估,請用list()包裹!)
目前沒有評論。