现在来看下⼏组实际使⽤案例。使⽤前别忘了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. Charles抓包数据导入postman

    Charles抓包数据导入postman 1.先抓取到对应的请求,右键,再点击Copy cURL Request,操作如下图所示:                                   ...

  2. 《Zookeeper分布式过程协同技术详解》之简介-分布式与Zookeeper简介

    [常见的分布式架构场景面临的问题]一般在主从架构中,主节点进程负责跟踪从节点的状态和任务的有效性,并分配任务到从节点.而这种架构中必须要解决的几个问题是,主节点崩溃.从节点崩溃.通信故障.主节点崩溃: ...

  3. Spring源码分析之getBean

    一.前言 spring作为JAVAEE最核心的框架,是每一个java开发者所必须掌握的,非常重要,本篇从一个简单例子入手,由浅入深的分析spring创建bean的全过程,目标在于彻底搞懂spring原 ...

  4. MS-08-067 windows smb服务 远程命令执行漏洞

    漏洞概要 MS-08-067是Windows平台中smb服务445端口的远程代码执行漏洞 利用成功可以远程控制主机 影响范围为:windows2000.xp.server 2003.server 20 ...

  5. 深入理解 Python 虚拟机:浮点数(float)的实现原理及源码剖析

    深入理解 Python 虚拟机:浮点数(float)的实现原理及源码剖析 在本篇文章当中主要分析在 cpython 虚拟机当中 float 类型的实现原理以及与他相关的一些源代码. Float 数据结 ...

  6. InstructPix2Pix: 动动嘴皮子,超越PS

    摘要:InstructPix2Pix提出了一种使用文本编辑图像的方法:给定输入图像和编辑指令,告诉模型要做什么,模型将遵循这些指令来编辑图像. 本文分享自华为云社区<InstructPix2Pi ...

  7. 【读书笔记】组合计数中的行列式方法 专题2 欧拉回路,the BEST theorem

    目录 专题2-欧拉回路,the BEST theorem 一些定义 一个有向图是欧拉的充要条件 BEST定理 BSET定理推论 k-ary de Bruijn sequence定义 BSET theo ...

  8. 自学UI设计有哪些书籍推荐?

    自学UI设计大致分为两种情况:其一.业余学习,技能拓展,不以求职为目的;其二.谋生手段,小白进阶学习或者有转行的打算.前者,无论是学习内容或者深度都可以根据自己的需求和兴趣点来做学习选择,相对来说,学 ...

  9. java顺序结构

    java顺序结构 java的基本结构就是顺序结构,一句一句执行 package charpter2; public class ShunXu { public static void main(Str ...

  10. Linux环境下使用jsoncpp

    目录 1. 下载jsoncpp 2. 生成静态库libjsoncpp.a 3. 复制相关文件至/usr/local下(方便编程) 4. CMakeList.txt编写(需要新增的) 1. 下载json ...