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

啊!从上面的示例结果来看,您可能已经注意到了,通过 .values().values_list() 返回的字典列表 依然是查询集。 (由于是延迟评估,若需立即评估,请使用 list() 包裹!)