19.聚合分组

 

聚合函数

  1. 全部的聚合函数都是放在django.db.models下面
  2. 集合函数不可以单独的执行,须要放在一些能够执行聚合函数的方法下面去执行,好比aggregate.示例代码以下
    result = Book.objects.aggregate(Avg("price"))
  3. 聚合函数执行完成后,给这个聚合函数的值取个名字,取名字的规则:默认是filed+__+聚合函数名字造成的.好比以上代码造成的名字叫作price__avg.若是不想使用默认的名字,那么能够在使用聚合函数的时候传递关键字参数进去,参数的名字就是聚合函数执行完成后的名字.示例代码以下:
    result = Book.objects.aggregate(avg=Avg("price"))

    以上传递了关键字参数avg=AVG('price'),那么之后Avg聚合函数执行完成的名字叫作avg
  4. aggregate:这个办法不会返回一个QuerySet对象,而是返回一个字典.这个字典中的能够就是聚合函数的名字,值就是聚合函数执行后的结果.
  5. aggregateannotate的相同和不一样:javascript

    • 相同:这两个方法均可以执行聚合函数。
    • 不一样:
      • aggregate返回的是一个字典,在这个字典中存储的是这个聚合函数执行的结果。而annotate返回的是一个QuerySet对象,而且会在查找的模型上添加一个聚合函数的属性。
      • aggregate不会作分组,而annotate会使用group by子句进行分组,只有调用了group by子句,才能对每一条数据求聚合函数的值。
  6. Count:用来求某个数据的个数。好比要求全部图书的数量,那么能够使用如下代码:html

    result = Book.objects.aggregate(book_nums=Count("id"))


    而且Count能够传递distinct=True参数,用来剔除那些重复的值,只保留一个。好比要获取做者表中,不一样邮箱的个数,那么这时候能够使用distinct=True。示例代码以下:java

    result = Author.objects.aggregate(email_nums=Count('email',distinct=True))
  7. MaxMin:求指定字段的最大值和最小值。示例代码以下:python

    result = Author.objects.aggregate(max=Max("age"),min=Min("age"))
  8. Sum:求某个字段值的总和。示例代码以下:ios

    result = BookOrder.objects.aggregate(total=Sum('price'))


    aggregateannotate方法能够在任何的QuerySet对象上调用。所以只要是返回了QuerySet对象,那么就能够进行链式调用。好比要获取2018年度的销售总额,那么能够先过滤年份,再求聚合函数。示例代码以下:web

    BookOrder.objects.filter(create_time__year=2018).aggregate(total=Sum('price'))
相关文章
相关标签/搜索