本文首发于微信公众号:Hunter后端

原文链接:Django笔记十六之aggregate聚合操作

这一篇笔记介绍一下关于聚合的操作,aggregate。

常用的聚合操作比如有平均数,总数,最大值,最小值等等

用到的 model 如下



class Author(models.Model):
name = models.CharField(max_length=100)
age = models.IntegerField() class Publisher(models.Model):
name = models.CharField(max_length=300) class Book(models.Model):
name = models.CharField(max_length=300)
pages = models.IntegerField()
price = models.DecimalField(max_digits=10, decimal_places=2)
rating = models.FloatField()
authors = models.ManyToManyField(Author)
publisher = models.ForeignKey(Publisher, on_delete=models.CASCADE)
pubdate = models.DateField() class Store(models.Model):
name = models.CharField(max_length=300)
books = models.ManyToManyField(Book)

聚合函数

  • Avg —— 平均数
  • Count —— 总数
  • Max —— 最大值
  • Min —— 最小值
  • Sum —— 总数

output_field —— 指定输出的数据格式

以下介绍一下几种聚合操作的例子,因为 Avg,Max,Min 都是一样的操作方法,所以用一个函数来做示例。

获取表中最大值:

from django.db.models import Max, Min, Avg

Book.objects.all().aggregate(Avg('price'))

对应的 SQL 为:

select avg(price) from blog_book;

返回的值为:

{'price__avg': Decimal('5.500000')}

指定聚合类型返回

因为 Book 中的 price 字段是 Decimal 字段,所以聚合之后返回的数据类型也是这个类型,如果想要更换成 Float 类型,可以用上 output_field 来指定输出类型:

Book.objects.all().aggregate(Avg('price', output_field=models.FloatField()))

返回的结果就是:

{'price__avg': 5.5}

指定聚合字段名称

Book.objects.aggregate(avg_price=Avg("price"))

以上用的示例都是 Avg 平均数,更换成 最大值 Max,最小值 Min 都是可以的

多个聚合操作

假设我们不止需要平均数,还需要最大值,最小值等等,我们可以在一个语句里直接操作

from django.db.models import Avg, Max, Min
Book.objects.aggregate(avg_price=Avg("price"), max_price=Max("price"), min_price=Min("price"))

关联表的聚合操作

对于 Store model,他有一个多对多的 book 的关系,如果想获取 Store 数据里,关联的 Book 的最大的 Book 的 price 数据:

Store.objects.aggregate(min_price=Min("books__price"))

如果有多个表链式关联,也可以直接链式聚合获取:

Store.objects.aggregate(youngest_age=Min("books__authors__age"))

以上就是本篇笔记的全部内容,其实还有一些聚合的操作,是关于 annotate 的一些用法示例,这里不多赘述,有时间可以单独开一个专门的笔记。

下一篇笔记将会对 SQL 中的 group by 用法在Django 中的对应操作做一个整体介绍。

如果想获取更多相关文章,可扫码关注阅读:

Django笔记十六之aggregate聚合操作的更多相关文章

  1. python3.4学习笔记(十六) windows下面安装easy_install和pip教程

    python3.4学习笔记(十六) windows下面安装easy_install和pip教程 easy_install和pip都是用来下载安装Python一个公共资源库PyPI的相关资源包的 首先安 ...

  2. (C/C++学习笔记) 十六. 预处理

    十六. 预处理 ● 关键字typeof 作用: 为一个已有的数据类型起一个或多个别名(alias), 从而增加了代码的可读性. typedef known_type_name new_type_nam ...

  3. python 学习笔记十六 django深入学习一 路由系统,模板,admin,数据库操作

    django 请求流程图 django 路由系统 在django中我们可以通过定义urls,让不同的url路由到不同的处理函数 from . import views urlpatterns = [ ...

  4. Java学习笔记十:Java的数组以及操作数组

    Java的数组以及操作数组 一:什么是数组: 数组可以理解为是一个巨大的“盒子”,里面可以按顺序存放多个类型相同的数据,比如可以定义 int 型的数组 scores 存储 4 名学生的成绩 数组中的元 ...

  5. mongdb aggregate聚合操作

    1.数据准备 查看前一篇group操作 2.aggregate函数参数讲解 mysql mongdb===================WHERE --->$match GROUP BY -- ...

  6. Django(十六)基于模板的登录案例:登录装饰器、csrf攻击方式及防护、ajax的Post 的csrf开启写法、生成验证码、加验证码登录、反向解析+传参

    一.csrf攻击 1.1 csrf攻击(跨站请求伪造) [csrf攻击即]:通过第3方网站,伪造请求(前提条件是你已经登录正常网站,并保存了session或cookie登录信息且没有退出),第三方网站 ...

  7. MySQL学习笔记十六:锁机制

    1.数据库锁就是为了保证数据库数据的一致性在一个共享资源被并发访问时使得数据访问顺序化的机制.MySQL数据库的锁机制比较独特,支持不同的存储引擎使用不同的锁机制. 2.MySQL使用了三种类型的锁机 ...

  8. Python基础学习笔记(六)常用列表操作函数和方法

    参考资料: 1. <Python基础教程> 2. http://www.runoob.com/python/python-lists.html 3. http://www.liaoxuef ...

  9. c语言学习之基础知识点介绍(十六):文件操作

    一.文件的分类 1.文本文件:打开之后能看得懂的文件 2.二进制文件:打开之后看不懂,类似乱码之类的文件(视频,音频打开之后,能看.听,是应为电脑中装有播放器,播放器中含有解码器). 二.操作文件的步 ...

  10. yii2源码学习笔记(十六)

    Module类的最后代码 /** * Registers sub-modules in the current module. * 注册子模块到当前模块 * Each sub-module shoul ...

随机推荐

  1. Java自增自减运算符

    3.1自增自减运算符 注意事项: ++和--既可以放在变量的后边,也可以放在变量的前边 单独实用的时候,++和--无论是放在变量的前边还是后边,结果是一样的 参与操作的时候,如果放在变量的后边,先拿变 ...

  2. 狐漠漠养成日记 Cp.00003 第二周

    上一周整周都在做Unity Newbies Jam,除了一些必要的比如考试或者课程,其他的都推后了. 为了赶项目进度,这一周我可以说是废寝忘食,基本上每天一顿饭,就睡仨小时那种. 以至于到最后一天,也 ...

  3. ARP协议 路由器原理

    ARP协议 路由器原理     1 广播与广播域 广播:将广播地址作为目的地址的数据帧 广播域:网络中能够接收到同一个广播所有节点的集合(在这里广播域越小越好) 交换机控制不了广播 路由器可以控制广播 ...

  4. Linux基础知识2

    目录和文件管理 linux以目录形式挂载(通过目录访问存储设备)文件系统,目录结构分层的树形结构. 链接:在共享文件和访问它的用户的若干目录项之间建立联系的方法,包括硬链接和软链接两种方式 linux ...

  5. linux命令基本操作

    chmod 命令 : chmod -R 755 tools_command/ 解释 : -R 为递归遍历tools_command文件夹, chmod 755修改权限: 查看所有用户 1.cat /e ...

  6. c++中的构造函数,拷贝构造函数和赋值函数

    1.拷贝构造和赋值函数的区别: 1)拷贝构造函数是一个对象初始化一块内存区域,这块内存就是新对象的内存区,而赋值函数是对于一个已经被初始化的对象来进行赋值操作. 2)一般来说在数据成员包含指针对象的时 ...

  7. Hadoop警告信息:WARN util.NativeCodeLoader: Unable to load native-hadoop library for your platform.

    when键入命令: hadoop fs -ls / 若出现以下警告信息: Hadoop警告问题:WARN util.NativeCodeLoader: Unable to load native-ha ...

  8. LaTeX in 24 Hours - 2. Fonts Selection

    文章目录 本章内容:字体 2.1 Text-Mode Fonts 2.2 Math-Mode Fonts 2.3 Emphasized Fonts 2.4 Colored Fonts 其他章节目录: ...

  9. ElasticSearch在linux环境安装和启动

    1.下载 https://www.elastic.co/cn/downloads/past-releases/elasticsearch-7-8-0 2.安装启动 2.1 错误1 Java HotSp ...

  10. OSPF与ISIS比较