经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » 程序设计 » Django » 查看文章
Django笔记十六之aggregate聚合操作
来源:cnblogs  作者:XHunter  时间:2023/4/6 8:43:22  对本文有异议

本文首发于微信公众号:Hunter后端
原文链接:Django笔记十六之aggregate聚合操作

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

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

用到的 model 如下

  1. class Author(models.Model):
  2. name = models.CharField(max_length=100)
  3. age = models.IntegerField()
  4. class Publisher(models.Model):
  5. name = models.CharField(max_length=300)
  6. class Book(models.Model):
  7. name = models.CharField(max_length=300)
  8. pages = models.IntegerField()
  9. price = models.DecimalField(max_digits=10, decimal_places=2)
  10. rating = models.FloatField()
  11. authors = models.ManyToManyField(Author)
  12. publisher = models.ForeignKey(Publisher, on_delete=models.CASCADE)
  13. pubdate = models.DateField()
  14. class Store(models.Model):
  15. name = models.CharField(max_length=300)
  16. books = models.ManyToManyField(Book)

聚合函数

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

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

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

获取表中最大值:

  1. from django.db.models import Max, Min, Avg
  2. Book.objects.all().aggregate(Avg('price'))

对应的 SQL 为:

  1. select avg(price) from blog_book;

返回的值为:

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

指定聚合类型返回

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

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

返回的结果就是:

  1. {'price__avg': 5.5}

指定聚合字段名称

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

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

多个聚合操作

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

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

关联表的聚合操作

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

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

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

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

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

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

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

原文链接:https://www.cnblogs.com/hunterxiong/p/17290995.html

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号