DjangoORM:values()和annotate()方法的使用

作者:

文章目录
  • 只查询需要的字段 合理使用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)
  • 目录
    • 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(): 最小值

          # 按出版社分组统计书籍数量
          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. 只查询需要的字段
          2. 合理使用select_related和prefetch_related
          3. 在数据库层面完成计算,而不是在Python中
          4. 对大型数据集考虑使用iterator()

          1. 使用values()和annotate()统计每个出版社出版的书籍数量
          2. 计算每个作者的书籍平均评分
          3. 找出每年出版书籍最多的月份

          values()和annotate()是Django ORM中强大的工具,能够高效地进行数据查询和统计分析。理解它们的区别和组合使用方式,可以大大提升开发效率和查询性能。

          以上为个人经验,希望能给大家一个参考,也希望大家多多支持风君子博客。

          您可能感兴趣的文章:

          • django使用sqlite3统计前台站点访问数量示例
          • Django把SQLite数据库转换为Mysql数据库的过程
          • Django数据库(SQlite)基本入门使用教程
          • django 将自带的数据库sqlite3改成mysql实例
          • Django 创建后台,配置sqlite3教程
          • Django将默认的SQLite更换为MySQL的实现
          • DJango的创建和使用详解(默认数据库sqlite3)

          站内搜索