文章目录
- values()方法用于返回一个包含字典的QuerySet,而不是模型实例。每个字典表示一个对象,键对应于模型字段名称。
- # 获取所有书籍的标题和出版日期 from myapp.models import Book books = Book.objects.values(‘title’, ‘pub_date’) # 返回结果示例: [{‘title’: ‘Django入门’, ‘pub_date’: datetime.date(2023, 1, 1)}, …]
- 只获取指定字段,减少内存使用 结果以字典形式返回,而不是模型实例 可以用于跨模型关系查询
- # 获取书籍及其作者姓名 books = Book.objects.values(‘title’, ‘author__name’)
- # 按出版社分组统计书籍数量 from django.db.models import Count stats = Book.objects.values(‘publisher’).annotate(count=Count(‘id’)) # 返回结果示例: [{‘publisher’: ‘A出版社’, ‘count’: 5}, …]
- # 按作者和出版年份分组统计 stats = Book.objects.values(‘author’, ‘pub_date__year’).annotate(count=Count(‘id’))
- values()在annotate()之前使用会改变分组依据 annotate()在values()之前使用会为每个对象添加注解
- # 统计每个分类下的文章数量和平均阅读量 from django.db.models import Count, Avg stats = Post.objects.values(‘category’).annotate( post_count=Count(‘id’), avg_views=Avg(‘views’) )
- # 统计每个用户的总消费金额和订单数 from django.db.models import Sum, Count user_stats = Order.objects.values(‘user’).annotate( total_spent=Sum(‘amount’), order_count=Count(‘id’) )
目录
- 1. values()方法
- 1.1 基本概念
- 1.2 基本用法
- 1.3 特点
- 1.4 关联查询
- 2. annotate()方法
- 2.1 基本概念
- 2.2 基本用法
- 2.3 常用聚合函数
- 3. values()和annotate()的组合使用
- 3.1 分组统计
- 3.2 多字段分组
- 3.3 注意事项
- 4. 实际案例
- 4.1 博客系统统计
- 4.2 电商系统分析
- 5. 性能优化建议
- 课后练习
- 总结
values()方法用于返回一个包含字典的QuerySet,而不是模型实例。每个字典表示一个对象,键对应于模型字段名称。
# 获取所有书籍的标题和出版日期
from myapp.models import Book
books = Book.objects.values('title', 'pub_date')
# 返回结果示例: [{'title': 'Django入门', 'pub_date': datetime.date(2023, 1, 1)}, ...]
- 只获取指定字段,减少内存使用
- 结果以字典形式返回,而不是模型实例
- 可以用于跨模型关系查询
# 获取书籍及其作者姓名
books = Book.objects.values('title', 'author__name')

annotate()用于给QuerySet中的每个对象添加计算字段(注解),通常与聚合函数一起使用。
from django.db.models import Count
from myapp.models import Author
# 计算每位作者的书籍数量
authors = Author.objects.annotate(book_count=Count('book'))
# 现在每个author对象都有一个book_count属性
Count(): 计数
Sum(): 求和
Avg(): 平均值
Max(): 最大值
Min(): 最小值
Count(): 计数Sum(): 求和Avg(): 平均值Max(): 最大值Min(): 最小值
# 按出版社分组统计书籍数量
from django.db.models import Count
stats = Book.objects.values('publisher').annotate(count=Count('id'))
# 返回结果示例: [{'publisher': 'A出版社', 'count': 5}, ...]
# 按作者和出版年份分组统计
stats = Book.objects.values('author', 'pub_date__year').annotate(count=Count('id'))
values()在annotate()之前使用会改变分组依据
annotate()在values()之前使用会为每个对象添加注解
values()在annotate()之前使用会改变分组依据annotate()在values()之前使用会为每个对象添加注解
# 统计每个分类下的文章数量和平均阅读量
from django.db.models import Count, Avg
stats = Post.objects.values('category').annotate(
post_count=Count('id'),
avg_views=Avg('views')
)
# 统计每个用户的总消费金额和订单数
from django.db.models import Sum, Count
user_stats = Order.objects.values('user').annotate(
total_spent=Sum('amount'),
order_count=Count('id')
)
- 只查询需要的字段
- 合理使用select_related和prefetch_related
- 在数据库层面完成计算,而不是在Python中
- 对大型数据集考虑使用iterator()
- 使用values()和annotate()统计每个出版社出版的书籍数量
- 计算每个作者的书籍平均评分
- 找出每年出版书籍最多的月份
values()和annotate()是Django ORM中强大的工具,能够高效地进行数据查询和统计分析。理解它们的区别和组合使用方式,可以大大提升开发效率和查询性能。
以上为个人经验,希望能给大家一个参考,也希望大家多多支持风君子博客。
您可能感兴趣的文章:
- django使用sqlite3统计前台站点访问数量示例
- Django把SQLite数据库转换为Mysql数据库的过程
- Django数据库(SQlite)基本入门使用教程
- django 将自带的数据库sqlite3改成mysql实例
- Django 创建后台,配置sqlite3教程
- Django将默认的SQLite更换为MySQL的实现
- DJango的创建和使用详解(默认数据库sqlite3)