支持聚合函数的方法:
提到聚合函数,首先我们要知道的就是这些聚合函数是不能在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:这个方法时一个QuerySet对象的API,在执行聚合函数的时候,是对QuerySet整个对象的某个属性汇总,在汇总时不会使用该模型的主键进行group by进行分组,得到的是一个结果字典。同时,该方法支持聚合关联表(如使用ForeignKey)中的字段,在聚合连表中字段时,传递该字段的方式与查询连表时传递字段的方式相同,会使用到"__"。示例代码如下:
from django.db.models import Avg from django.db import connection
1、对当前表中数据进行聚合:
result = Author.objects.aggregate(avg_age=Avg('age')) print(connection.queries) # 打印执行时所有的查询语句
2、对连表中数据进行聚合:
result = Book.objects.aggregate(sum=Sum('bookorder__price'))
2、annotate:这个方法不但可以执行聚合函数,也可以传递F、Q对象为当前QuerySet生成一个新的属性。
这个方法一般聚合的是连表中的字段,会为当前QuerySet中的每个对象生成一个独立的摘要,为查询的模型增加一个新的属性,这个属性的值就是使用聚合函数所得到的值,在使用这个聚合函数的时候annotate会使用这个模型的主键进行group by进行分组(注意这里只有在使用聚合函数生成新字段的时候会进行group by,在使用F、Q表达式增添新字段时,并不会使用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、Max和Min:计算某个字段的最大值和最小值,用法与Avg一样
4、Sum:计算总和,用法与Avg一样
注:总结一下,其实可以简单的理解使用aggregate时,是对QuerySet整个对象的某个属性汇总聚合,不会使用分组。而使用annotate方法时,是为QuerySet中的每个对象生成一个独立的摘要,一定会使用分组,然后再聚合
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持小牛知识库。
本文向大家介绍Django Aggregation聚合使用方法解析,包括了Django Aggregation聚合使用方法解析的使用技巧和注意事项,需要的朋友参考一下 在当今根据需求而不断调整而成的应用程序中,通常不仅需要能依常规的字段,如字母顺序或创建日期,来对项目进行排序,还需要按其他某种动态数据对项目进行排序。Djngo聚合就能满足这些要求。 以下面的Model为例 快速了解 聚合生成Gen
在介绍 Django 中 ORM 模型的聚合函数之前,我们先要了解下 MySQL 中常用的聚合函数。首先同样是准备数据,使用我i们之前在第 18 小节中完成的插入 100 条数据的代码,重新执行一次: (django-manual) [root@server test]# python insert_records.py 批量插入完成 此时,连同上次操作剩余的两条会员记录,数据库中总共有 10
问题内容: 我正在尝试从模型中汇总整数列表。整数派生的字段是装饰器字段。装饰器按预期工作,并且在内,如果直接传递,则显示不会出现问题。但是,如果尝试将字段传递给引发错误的上下文,则该错误基本上会说出一个错误,然后显示一系列不包含任何装饰器字段的模型字段。 我的问题是-如何汇总模型中的(求和)派生字段? **我已经大大简化了和。 问题答案: 您无法使用属性进行汇总,因为该属性在数据库中不存在。但是,
本文向大家介绍SQL中的开窗函数详解可代替聚合函数使用,包括了SQL中的开窗函数详解可代替聚合函数使用的使用技巧和注意事项,需要的朋友参考一下 在没学习开窗函数之前,我们都知道,用了分组之后,查询字段就只能是分组字段和聚合的字段,这带来了极大的不方便,有时我们查询时需要分组,又需要查询不分组的字段,每次都要又到子查询,这样显得sql语句复杂难懂,给维护代码的人带来很大的痛苦,然而开窗函数出现了,
问题内容: Django 有两种方法,和。该文档说: 与gregation()不同,annotate()不是终端子句。annotate()子句的输出是QuerySet。 它们之间还有其他区别吗?如果没有,那为什么存在呢? 问题答案: 我将重点放在示例查询而不是文档中的引用上。A计算整个查询集的值。计算查询集中每个项目的汇总值。 聚合 返回包含查询集中所有书籍的平均价格的字典。 注解 q 是书籍的查
computed属性访问数组中的所有项以确定其值。 它可以轻松添加项目并从阵列中删除项目。 从属密钥包含一个特殊密钥@each ,它更新当前计算属性的绑定和观察者。 例子 (Example) 以下示例通过使用Ember的@each键显示计算属性和聚合数据的使用 - import Ember from 'ember'; export default function() { var Perso