Django笔记十六之aggregate聚合操作
2023/4/6 1:23:13
本文主要是介绍Django笔记十六之aggregate聚合操作,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
本文首发于微信公众号: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聚合操作的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2024-12-20go-zero 框架的 RPC 服务 启动start和停止 底层是怎么实现的?-icode9专业技术文章分享
- 2024-12-19Go-Zero 框架的 RPC 服务启动和停止的基本机制和过程是怎么实现的?-icode9专业技术文章分享
- 2024-12-18怎么在golang中使用gRPC测试mock数据?-icode9专业技术文章分享
- 2024-12-15掌握PageRank算法核心!你离Google优化高手只差一步!
- 2024-12-15GORM 中的标签 gorm:"index"是什么?-icode9专业技术文章分享
- 2024-12-11怎么在 Go 语言中获取 Open vSwitch (OVS) 的桥接信息(Bridge)?-icode9专业技术文章分享
- 2024-12-11怎么用Go 语言的库来与 Open vSwitch 进行交互?-icode9专业技术文章分享
- 2024-12-11怎么在 go-zero 项目中发送阿里云短信?-icode9专业技术文章分享
- 2024-12-11怎么使用阿里云 Go SDK (alibaba-cloud-sdk-go) 发送短信?-icode9专业技术文章分享
- 2024-12-10搭建个人博客网站之一、使用hugo创建个人博客网站