写点什么

Django 笔记十六之 aggregate 聚合操作

作者:Hunter熊
  • 2023-04-25
    北京
  • 本文字数:1195 字

    阅读完需:约 4 分钟

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, MinBook.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 中的对应操作做一个整体介绍。

发布于: 刚刚阅读数: 2
用户头像

Hunter熊

关注

公众号:Hunter后端 2018-09-17 加入

Python后端工程师,欢迎互相沟通交流

评论

发布
暂无评论
Django笔记十六之aggregate聚合操作_Python_Hunter熊_InfoQ写作社区