django的聚合函数和aggregate、annotate方法使用

支持聚合函数的方法:
  提到聚合函数,首先我们要知道的就是这些聚合函数是不能在django中单独使用的,要想在django中使用django聚合函数,就必须把这些聚合函数放到支持他们的方法内,这样才能执行。支持聚合函数的方法有两种,分别是aggregate和annotate,这两种方法执行的原生SQL以及结果都有很大的区别,下面我们以实例操作的方式一一介绍:

  # 示例模型:
  class Author(models.Model):
    """作者模型"""
    name = models.CharField(max_length=100)
    age = models.IntegerField()
    email = models.EmailField()

  class Book(models.Model):
    """图书模型"""
    name = models.CharField(max_length=100)
    author = models.ForeignKey(‘Author‘,on_delete=models.CASCADE)
    price = models.FloatField()

  class BookOrder(models.Model):
    """图书订单模型"""
    book = models.ForeignKey(‘Book‘,on_delete=models.CASCADE)
    sailprice = models.FloatField()
    create_time = models.DateTimeField(auto_now_add=True)

  1、aggregate:这个方法在执行聚合函数的时候,支持聚合连表(如使用ForeignKey)中的字段,使用于类QuerySet对象上,是对QuerySet整个对象的某个属性汇总,在汇总时不会使用该模型的主键进行group by进行分组,得到的是一个结果字典,例如提取所有作者的平均年龄,示例代码如下:
  from django.db.models import Avg
  from django.db import connection

  result = Author.objects.aggregate(avg_age=Avg(‘age‘))
  print(connection.queries) # 打印执行时所有的查询语句

  2、annotate:这个函数在执行聚合函数的时候,会为QuerySet中的每个对象生成一个独立的摘要,我们可以看做为查询的模型增加一个新的属性,这个属性的值就是使用聚合函数所得到的值,在使用这个聚合函数的时候annotate会使用这个模型的主键进行group by进行分组,然后根据分组的结果进行聚合,这一点正符合为QuerySet中每个对象增加一个独立摘要的事实。使用这个方法执行聚合函数,得到的结果是一个QuerySet对象,结果依然能够调用filter()、order_by()甚至annotate()进行再次聚合,现在我想提取每一本书的平均销售的价格(注意销售价格在BookOrder表中):
  from django.db.models import Avg
  from django.db import connection

  books = Book.objects.annotate(avg=Avg(‘bookorder__sailprice‘))
  for book in books:
  print(‘%s/%s‘%(book.name,book.avg)) # 注意这里的avg属性就是annotate执行聚合函数得到的
  print(connection.queries)

聚合函数:
  在Django中,聚合函数都是在django.db.models模块下的,具体的聚合函数有Avg、Count、Max、Min、Sum,现在我们一一介绍这些函数的作用:
  1、Avg:计算平均值,使用于与数值相关的字段,如果使用aggregate方法来执行这个函数,那么会得到一个字典,默认情况下,字典的键为field__avg,值为执行这个聚合函数所得到的值,示例代码如下:
  # 计算所有作者的平均年龄
  result = Author.objects.aggregate(Avg(‘age‘))
  print(result) # 结果为:{"age__avg": 23.8}

  如果想要使用自定义的键,那么可以把aggregate中的未知参数变为关键字参数,该关键字就是得到的键,示例代码如下:
  result = Author.objects.aggregate(avgAge=Avg(‘age‘))
  print(result) # 结果为:{"avgAge": 23.8}

  如果使用annotate方法执行这个函数,那么得到的结果就是一个QuerySet对象,只不过这个对象中的每一个都会添加一个属性,这个属性的名称其实和上面的键一样,可以使用默认也可以自定义,使用方法与在aggregate中键名的定义一样,这里就不再赘述:
  books = Book.objects.annotate(avg=Avg(‘bookorder__sailprice‘))
  for book in books:
    print(‘%s/%s‘%(book.name,book.avg)) # 注意这里的avg属性就是annotate执行聚合函数得到的
  print(connection.queries)

  2、Count:计算数量,基本用法与Avg相同,在使用这个聚合函数的时候可以传递一个distinct参数用来去重:
  # 计算总共有多少个订单
  result = BookOrder.objects.aggregate(total=Count(‘id‘,distanct=True))
  print(result) # 结果为:{"total": 18}

  # 计算每本书的订单量
  books = Book.objects.annotate(total=Count(‘bookorder__id‘))
  for book in books:
  print(‘%s/%s‘%(book.name,book.total))

  3、MaxMin:计算某个字段的最大值和最小值,用法与Avg一样

  4、Sum:计算总和,用法与Avg一样

注:总结一下,其实可以简单的理解使用aggregate时,是对QuerySet整个对象的某个属性汇总聚合,不会使用分组。而使用annotate方法时,是为QuerySet中的每个对象生成一个独立的摘要,一定会使用分组,然后再聚合

原文地址:https://www.cnblogs.com/limaomao/p/9327740.html

时间: 2024-10-24 14:43:06

django的聚合函数和aggregate、annotate方法使用的相关文章

django ORM聚合函数

在Django中,聚合函数是通过aggregate方法实现的,aggregate方法返回的结果是一个字典 在使用时需要先导入模块from django.db.models import Count,Avg,Max,Min,Sum 假设有一个模型 class Book(models.Model): name = models.CharField(max_length=100) pages = models.IntegerField() price = models.FloatField() aut

H2Database聚合函数

聚合函数(Aggregate Functions) AVG  BOOL_AND  BOOL_OR  COUNT  GROUP_CONCAT MAX  MIN  SUM  SELECTIVITY  STDDEV_POP STDDEV_SAMP  VAR_POP  VAR_SAMP 数值函数(Numeric Functions) ABS  ACOS  ASIN  ATAN  COS  COT  SIN  TAN  ATAN2  BITAND  BITOR  BITXOR MOD  CEILING 

Spark 系列(十一)—— Spark SQL 聚合函数 Aggregations

一.简单聚合 1.1 数据准备 // 需要导入 spark sql 内置的函数包 import org.apache.spark.sql.functions._ val spark = SparkSession.builder().appName("aggregations").master("local[2]").getOrCreate() val empDF = spark.read.json("/usr/file/json/emp.json"

072:【Django数据库】ORM聚合函数详解-aggregate和annotate

ORM聚合函数详解-aggregate和annotate: aggregate和annotate的区别: 1.aggregate :返回使用聚合函数后的字段和值.2.annotate :在原来模型字段的基础之上添加一个使用了聚合函数的字段,并且在使用聚合函数的时候,会使用当前这个模型的主键进行分组(group by).比如以上 Sum 的例子,如果使用的是 annotate ,那么将在每条图书的数据上都添加一个字段叫做 total ,计算这本书的销售总额.而如果使用的是 aggregate ,那

070:【Django数据库】ORM聚合函数详解-准备工作

ORM聚合函数详解-准备工作: 如果你用原生SQL,则可以使用聚合函数来提取数据.比如提取某个商品销售的数量,那么可以使用count,如果想要知道商品销售的平均价格,那么可以使用avg.聚合函数是通过aggregate方法来实现的.在讲解这些聚合函数的用法的时候,都是基于以下的模型对象来实现的. 创建如下models: from django.db import models class Author(models.Model): """作者模型""&qu

075: 【Django数据库】ORM聚合函数详解-Sum

ORM聚合函数详解-Sum: Sum :求指定对象的总和.比如要求图书的销售总额.那么可以使用以下代码实现: from djang.db.models import Sum result = Book.objects.annotate(total=Sum("bookstore__price")).values("name","total") 以上的代码 annotate 的意思是给 Book 表在查询的时候添加一个字段叫做 total ,这个字段

django字段查询参数及聚合函数

字段查询是指如何指定SQL WHERE子句的内容.它们用作QuerySet的filter(), exclude()和get()方法的关键字参数. 默认查找类型为exact. 下表列出了所有的字段查询参数: 字段名 说明 exact 精确匹配 iexact 不区分大小写的精确匹配 contains 包含匹配 icontains 不区分大小写的包含匹配 in 在..之内的匹配 gt 大于 gte 大于等于 lt 小于 lte 小于等于 startswith 从开头匹配 istartswith 不区分

071:【Django数据库】ORM聚合函数详解-Avg

ORM聚合函数详解-Avg: Avg:求平均值.比如想要获取所有图书的价格平均值.那么可以使用以下代码实现: from django.db.models import Avg result = Book.objects.aggregate(Avg('price')) print(result) 以上的打印结果是: {"price__avg":23.0} 其中price__avg的结构是根据field__avg规则构成的.如果想要修改默认的名字,那么可以将Avg赋值给一个关键字参数.示例

第三百零五节,Django框架,Views(视图函数),也就是逻辑处理函数里的各种方法与属性

Django框架,Views(视图函数),也就是逻辑处理函数里的各种方法与属性 Views(视图函数)逻辑处理,最终是围绕着两个对象实现的 http请求中产生两个核心对象: http请求:HttpRequest对象 http响应:HttpResponse对象 所在位置:django.http 之前我们用到的参数request就是HttpRequest     HttpRequest对象 逻辑处理函数的第一个形式参数,接收到的就是HttpRequest对象,这个对象里封装着用户的各种请求信息,通过