现在来看下⼏组实际使⽤案例。使⽤前别忘了import Avg, Max, Min或者Sum⽅法哦
from django.db.models import Avg, Max, Min
计算学⽣平均年龄, 返回字典。age和avg间是双下划线哦
Student.objects.all().aggregate(Avg(‘age’))
{ ‘age__avg’: 12 }
学⽣平均年龄,返回字典。all()不是必须的。
Student.objects.aggregate(Avg(‘age’))
{ ‘age__avg: 12’ }
计算学⽣总年龄, 返回字典。
Student.objects.aggregate(Sum(‘age’))
{ ‘age__sum’: 144 }
学⽣平均年龄, 设置字典的key
Student.objects.aggregate(average_age = Avg(‘age’))

现在来看下⼏组实际使⽤案例。使⽤前别忘了import Avg, Max, Min或者Sum⽅法哦
from django.db.models import Avg, Max, Min
计算学⽣平均年龄, 返回字典。age和avg间是双下划线哦
Student.objects.all().aggregate(Avg(‘age’))
{ ‘age__avg’: 12 }
学⽣平均年龄,返回字典。all()不是必须的。
Student.objects.aggregate(Avg(‘age’))
{ ‘age__avg: 12’ }
计算学⽣总年龄, 返回字典。
Student.objects.aggregate(Sum(‘age’))
{ ‘age__sum’: 144 }
学⽣平均年龄, 设置字典的key
Student.objects.aggregate(average_age = Avg(‘age’))

{ ‘average_age’: 12

学⽣最⼤年龄,返回字典
Student.objects.aggregate(Max(‘age’))
{ ‘age__max’: 12 }
同时获取学⽣年龄均值, 最⼤值和最⼩值, 返回字典
Student.objects.aggregate(Avg('age‘), Max('age‘), Min('age‘))
{ ‘age__avg’: 12, ‘age__max’: 18, ‘age__min’: 6, }
根据Hobby反查学⽣最⼤年龄。查询字段student和age间有双下划线哦。
Hobby.objects.aggregate(Max(‘student__age’))
{ ‘student__age__max’: 12 }
你注意到了吗? aggregate⽅法返回Dict类型数据和django的内容对象(context object)是⼀样的哦。你可以很轻松地将结果传递给模板,
在模板中显⽰。
annotate()⽅法详解
annotate的中⽂意思是注释,⼩编我觉得是⾮常地词不达意,⼀个更好的理解是分组(Group By)。如果你想要对数据集先进⾏分组然后再
进⾏某些聚合操作或排序时,需要使⽤annotate⽅法来实现。与aggregate⽅法不同的是,annotate⽅法返回结果的不仅仅是含有统计结
果的⼀个字典,⽽是包含有新增统计字段的查询集(queryset).
我们接下来也看下⼏个实际使⽤案例。
按学⽣分组,统计每个学⽣的爱好数量

Student.objects.annotate(Count(‘hobbies’))
返回的结果依然是Student查询集,只不过多了hobbies__count这个字段。如果你不喜欢这个默认名字,你当然可以对这个字段进⾏⾃定
义从⽽使它变得更直观。
按学⽣分组,统计每个学⽣爱好数量,并⾃定义字段名
Student.objects.annotate(hobby_count_by_student=Count(‘hobbies’))
按爱好分组,再统计每组学⽣数量。
Hobby.objects.annotate(Count(‘student’))
按爱好分组,再统计每组学⽣最⼤年龄。
Hobby.objects.annotate(Max(‘student__age’))
Annotate⽅法与Filter⽅法联⽤
有时我们需要先对数据集先筛选再分组,有时我们还需要先分组再对查询集进⾏筛选。根据需求不同,我们可以合理地联⽤annotate⽅法
和filter⽅法。注意: annotate和filter⽅法联⽤时使⽤顺序很重要。
先按爱好分组,再统计每组学⽣数量, 然后筛选出学⽣数量⼤于1的爱好。
Hobby.objects.annotate(student_num=Count(‘student’)).filter(student_num__gt=1)
先把爱好以’d’开头的爱好分组,再统计每组学⽣数量。
Hobby.objects.filter(name__startswith=“d”).annotate(student_num=Count('student‘))
Annotate与order_by()联⽤

我们同样可以使⽤order_by⽅法对annotate⽅法返回的数据集进⾏排序。

先按爱好分组,再统计每组学⽣数量, 然后按每组学⽣数量⼤⼩对爱好排序。
Hobby.objects.annotate(student_num=Count('student‘)).order_by(‘student_num’)
统计最受学⽣欢迎的5个爱好。
Hobby.objects.annotate(student_num=Count('student‘)).order_by(‘student_num’)[:5]
Annotate与values()联⽤
我们在前例中按学⽣对象进⾏分组,我们同样可以按学⽣姓名name来进⾏分组。唯⼀区别是本例中,如果两个学⽣具有相同名字,那么他
们的爱好数量将叠加。
按学⽣名字分组,统计每个学⽣的爱好数量。
Student.objects.values(‘name’).annotate(Count(‘hobbies’))
你还可以使⽤values⽅法从annotate返回的数据集⾥提取你所需要的字段,如下所⽰:
按学⽣名字分组,统计每个学⽣的爱好数量。
Student.objects.annotate(hobby_count=Count(‘hobbies’)).values(‘name’, ‘hobby_count’)
⼩结
Django的aggregate和annotate⽅法属于⾼级查询⽅法,主要⽤于组合查询,可以⼤⼤提升数据库查询效率。当你需要对查询集
(queryset)的某些字段进⾏聚合操作时(⽐如Sum, Avg, Max),请使⽤aggregate⽅法。如果你想要对数据集先进⾏分组(Group By)然后
再进⾏某些聚合操作或排序时,请使⽤annotate⽅法。最后希望本⽂提供的⼀些⽰例对你有所帮助哦

调用案例:

from django.db.models import Sum

def result_test(request):
var = request.POST.get('selectedTests')
booktests = BookTest.objects.filter(test__in=var.split(','))
total_rate = booktests.aggregate(total=Sum('rate'))['total'] or 0

aggregate和annotate⽅法的更多相关文章

  1. django的聚合函数和aggregate、annotate方法使用

    支持聚合函数的方法: 提到聚合函数,首先我们要知道的就是这些聚合函数是不能在django中单独使用的,要想在django中使用这些聚合函数,就必须把这些聚合函数放到支持他们的方法内去执行.支持聚合函数 ...

  2. aggregate和annotate使用

    aggregate和annotate方法的使用场景 Django的aggregate和annotate方法属于高级查询方法,主要用于组合查询,是Django高手们必需要熟练掌握的.当我们需要对查询集( ...

  3. aggregate和annotate方法使用详解与示例

    aggregate和annotate方法的使用场景 Django的aggregate和annotate方法属于高级查询方法,主要用于组合查询.当我们需要对查询集(queryset)的某些字段进行计算或 ...

  4. [TimLinux] django aggregate和annotate示例

    1. 聚合与注解 聚合(aggregate)比较好理解,注解(annotate)真不好理解,这篇示例参考了文章“django中聚合aggregate和annotate GROUP BY的使用方法”提供 ...

  5. 72.Python中ORM聚合函数详解:Avg,aggregate,annotate

    聚合函数: 如果你用原生SQL语句,则可以使用聚合函数提取数据.比如提取某个商品销售的数量,那么就可以使用Count,如果想要知道销售的平均价格,那么就可以使用Avg. 聚合函数是通过aggregat ...

  6. Django的aggregate()和annotate()函数的区别

    aggregate() aggregate()为所有的QuerySet生成一个汇总值,相当于Count().返回结果类型为Dict. annotate() annotate()为每一个QuerySet ...

  7. django中聚合aggregate和annotate GROUP BY的使用方法

    接触django已经很长时间了,但是使用QuerySet查询集的方式一直比较低端,只会使用filter/Q函数/exclude等方式来查询,数据量比较小的时候还可以,但是如果数据量很大,而且查询比较复 ...

  8. 03: Django Model数据库操作

    目录:Django其他篇 01:Django基础篇 02:Django进阶篇 03:Django数据库操作--->Model 04: Form 验证用户数据 & 生成html 05:Mo ...

  9. Django2.0使用

    创建项目: 通过命令行的方式:首先要进入到安装了django的虚拟环境中.然后执行命令: django-admin startproject [项目的名称] 这样就可以在当前目录下创建一个项目了. 通 ...

  10. 项目完成小结 - Django3.x版本 - 开发部署小结 (2)

    前言 好久没更新博客了,最近依然是在做之前博客说的这个项目:项目完成 - 基于Django3.x版本 - 开发部署小结 这项目因为前期工作出了问题,需求没确定好,导致了现在要做很多麻烦的工作,搞得大家 ...

随机推荐

  1. 白鹭egret 控制屏幕方向

    this.stage.orientation=fangxiang; fangxiang值: portrait landscape auto

  2. VUE配置proxy代理、开发环境、测试环境、生产环境

    VUE配置proxy代理.开发环境.测试环境.生产环境 前端开发过程中,我们经常会碰到跨域的问题,下面我们来配置下,不同的环境下,统一的跨域问题解决. 1.根目录下新建三个环境的配置文件,.env.d ...

  3. Java笔记第七弹

    案例:复制Java文件(打印流改进版) import java.io.*; public class Main{ public static void main(String[] args) thro ...

  4. Mathematica制作和使用程序包

    步骤 这里拿你制作并且使用一个程序包lost为例子 新建一个空白.wl文档,输入代码如下 BeginPackage[ "MyPkg`"] MainFunction::usage = ...

  5. University of Toronto Scarborough Campus December 7, 2017 CSC C73 Final Examination Instructor: Vassos Hadzilacos

    https://app.yinxiang.com/shard/s59/res/8a11b895-19b5-4ca1-aefe-10b5985b8af9/CSCC73 Final 17.pdf 自己尝试 ...

  6. 百度生成式AI产品文心一言邀你体验AI创作新奇迹:百度CEO李彦宏详细透露三大产业将会带来机遇(文末附文心一言个人用户体验测试邀请码获取方法,亲测有效)

    目录 中国版ChatGPT上线发布 强大中文理解能力 智能文学创作.商业文案创作 图片.视频智能生成 中国生成式AI三大产业机会 新型云计算公司 行业模型精调公司 应用服务提供商 总结 获取文心一言邀 ...

  7. 怎么用ChatGPT写代码,ChatGPT怎么改代码修BUG

    ChatGPT 是一个自然语言处理模型,可以模拟人类语言生成文本,可以用于写代码和修复bug.在本文中,我们将介绍如何使用 ChatGPT 写代码和修bug. 怎么用ChatGPT写代码? 虽然 Ch ...

  8. Live Home 3D Pro - 用于公寓和房屋的室内设计,支持 3D 实时渲染

    Live Home 3D Pro是一个直观的应用程序,用于公寓和房屋的室内设计,以及几乎任何复杂的景观.专业版提供了一套扩展的工具和独特的出口质量. 下载 ► Live Home 3D Pro 下载安 ...

  9. 关于VUE3的疑问。

    1.响应式数据的声明 中 ref 与 reactive 有什么区别? 答:参考答案 .个人理解:ref最好用来定义基本数据类型,使用时要用.value :reactive最好用来定义引用数据类型.re ...

  10. VUE基本写法

    VUE基本结构 <!DOCTYPE html> <html lang="en"> <head> <meta charset="U ...