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() 是一個強大的功能,可以在數據查詢時減少不必要的字段以優化性能!🚀 根據目的,在需要以字典形式獲取數據而不是模型對象時,十分有用 😊

Django QuerySet .values() method concept

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