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()包裹!)
Add a New Comment