gpt4 book ai didi

Django笔记十六之aggregate聚合操作

转载 作者:我是一只小鸟 更新时间:2023-04-05 22:31:37 26 4
gpt4 key购买 nike

本文首发于微信公众号: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聚合操作的文章就讲到这里了,如果你想了解更多关于Django笔记十六之aggregate聚合操作的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com