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()
是在数据查询时减少不必要字段以优化性能的强大功能! 🚀 根据使用目的,当需要以字典形式获取数据而不是模型对象时非常有用! 😊
啊!从上面的示例结果来看,您可能已经注意到了,通过 .values() 和 .values_list() 返回的字典列表 依然是查询集。 (由于是延迟评估,若需立即评估,请使用 list() 包裹!)
目前没有评论。