aggregate和annotate⽅法
现在来看下⼏组实际使⽤案例。使⽤前别忘了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⽅法的更多相关文章
- django的聚合函数和aggregate、annotate方法使用
支持聚合函数的方法: 提到聚合函数,首先我们要知道的就是这些聚合函数是不能在django中单独使用的,要想在django中使用这些聚合函数,就必须把这些聚合函数放到支持他们的方法内去执行.支持聚合函数 ...
- aggregate和annotate使用
aggregate和annotate方法的使用场景 Django的aggregate和annotate方法属于高级查询方法,主要用于组合查询,是Django高手们必需要熟练掌握的.当我们需要对查询集( ...
- aggregate和annotate方法使用详解与示例
aggregate和annotate方法的使用场景 Django的aggregate和annotate方法属于高级查询方法,主要用于组合查询.当我们需要对查询集(queryset)的某些字段进行计算或 ...
- [TimLinux] django aggregate和annotate示例
1. 聚合与注解 聚合(aggregate)比较好理解,注解(annotate)真不好理解,这篇示例参考了文章“django中聚合aggregate和annotate GROUP BY的使用方法”提供 ...
- 72.Python中ORM聚合函数详解:Avg,aggregate,annotate
聚合函数: 如果你用原生SQL语句,则可以使用聚合函数提取数据.比如提取某个商品销售的数量,那么就可以使用Count,如果想要知道销售的平均价格,那么就可以使用Avg. 聚合函数是通过aggregat ...
- Django的aggregate()和annotate()函数的区别
aggregate() aggregate()为所有的QuerySet生成一个汇总值,相当于Count().返回结果类型为Dict. annotate() annotate()为每一个QuerySet ...
- django中聚合aggregate和annotate GROUP BY的使用方法
接触django已经很长时间了,但是使用QuerySet查询集的方式一直比较低端,只会使用filter/Q函数/exclude等方式来查询,数据量比较小的时候还可以,但是如果数据量很大,而且查询比较复 ...
- 03: Django Model数据库操作
目录:Django其他篇 01:Django基础篇 02:Django进阶篇 03:Django数据库操作--->Model 04: Form 验证用户数据 & 生成html 05:Mo ...
- Django2.0使用
创建项目: 通过命令行的方式:首先要进入到安装了django的虚拟环境中.然后执行命令: django-admin startproject [项目的名称] 这样就可以在当前目录下创建一个项目了. 通 ...
- 项目完成小结 - Django3.x版本 - 开发部署小结 (2)
前言 好久没更新博客了,最近依然是在做之前博客说的这个项目:项目完成 - 基于Django3.x版本 - 开发部署小结 这项目因为前期工作出了问题,需求没确定好,导致了现在要做很多麻烦的工作,搞得大家 ...
随机推荐
- cmd查看对应端口使用情况
cmd查看端口号netstat -ano | findstr 80
- IP代理的使用 IP代理爬取视频
IP代理的使用 IP代理的分类 透明代理:目标网址知道你使用了代理并且知道你的源IP地址 匿名代理:匿名程序比较低 也就是网站知道你使用代理 但是查不出来源IP地址 高匿代理:网站不知道你使用了代理 ...
- wsl 中 docker-compose 搭建 kafka 集群出现的外部访问错误
在 wsl 中用 docker-compose 搭建了一台 zookeeper + 三台 broker 的 kafka 集群,使用的镜像是 bitnami/kafka,在按照镜像文档运行容器后,发现运 ...
- 2020寒假学习笔记13------Python基础语法学习(二)
同一运算符 同一运算符用于比较两个对象的存储单元,实际比较的是对象的地址. 运算符 描述 is is 是判断两个标识符是不是引用同一个对象 is not is not 是判断两个标识符是不是引用 ...
- Linux线程同步必知,常用方法揭秘!
一.为什么要线程同步 在Linux 多线程编程中,线程同步是一个非常重要的问题.如果线程之间没有正确地同步,就会导致程序出现一些意外的问题,例如: 竞态条件(Race Condition):多个线程同 ...
- 团队如何选择合适的Git分支策略?
现代软件开发过程中要实现高效的团队协作,需要使用代码分支管理工具实现代码的共享.追溯.回滚及维护等功能.目前流行的代码管理工具,包括CVS,SVN,Git,Mercurial等. 相比CVS和SVN的 ...
- 6步带你用Spring Boot开发出商城高并发秒杀系统
摘要:本博客将介绍如何使用 Spring Boot 实现一个简单的商城秒杀系统,并通过使用 Redis 和 MySQL 来增强其性能和可靠性. 本文分享自华为云社区<Spring Boot实现商 ...
- day33:进程锁&事件&进程队列&进程间共享数据
目录 1.锁:Lock 2.信号量:Semaphone 3.事件:Event 4.进程队列:Queue 5.生产者和消费者模型 6.JoinableQueue 7.Manager:进程之间共享数据 锁 ...
- 最新版本 Stable Diffusion 开源 AI 绘画工具之图生图进阶篇
目录 图生图基本参数 图生图(img2img) 涂鸦绘制(Sketch) 局部绘制(Inpaint) 涂鸦蒙版(Inpaint sketch) 上传蒙版(Inpaint upload) 图生图基本参数 ...
- 使用CodeArts发布OBS,函数工作流刷新CDN缓存
摘要:上次通过OBS和CDN部署来Hexo网站,但是每次我们不可能都自己编译然后在上传到OBS,不然太麻烦了,所以我们需要构建流水线,通过PUSH Markdown来发布文章. 本文分享自华为云社区& ...