Django的QuerySet
有两个方法,annotate
和aggregate
。
与aggregate()不同,annotate()不是一个终止子句。annotate()子句的输出是一个QuerySet。https://docs.djangoproject.com/en/4.1/topics/db/aggregation/#generating-aggregates-for-each-item-in-a-queryset
它们之间还有什么不同吗?如果没有,那么为什么aggregate
存在呢?
4条答案
按热度按时间9jyewag01#
我将重点介绍示例查询,而不是您从文档中引用的内容。
Aggregate
计算整个查询集的值。Annotate
计算查询集中每个项目的汇总值。聚集体
返回包含查询集中所有本书的平均价格的字典。
注解
q
是书的查询集,但是每本书都被注解了作者的数量。xxb16uws2#
模型中:
在壳体中:
模型中:
视图中:
huwehgph3#
这是主要的区别,但是聚合的工作范围也比注解更大。注解与查询集中的单个项有着内在的联系。如果您在多对多字段上运行
Count
注解,您将获得查询集中每个成员的单独计数(作为一个附加属性)。然而,如果你对聚合做同样的事情,它会试图计算查询集的 * 每个 * 成员上的每个关系,甚至重复的,并将其作为一个值返回。of1yzvn44#
id
列。aggregate()
和annotate()
。例如,
Category
和Product
型号如下:下面还有
Category
和Product
管理员:并且,有以下2个类别:
并且,有以下5种产品:
并且,下面有
test
视图:首先,我解释一下
aggregate()
。聚合物():
现在,我运行
test
视图,该视图在aggregate()
的Avg()、Count()、Max()、Min()和Sum()中有列id
、category_id
和price
,如下所示:然后,在控制台上输出以下字典:
并且
aggregate()
可以任意顺序接受多种列和函数,多个同类列和函数以及没有列和函数,如下所示。* 多个同类列和函数的多个相同结果被合成为一个结果,并且没有列和函数得到空字典:然后,在控制台上输出以下字典:
接下来,我将解释
annotate()
。注解():
现在,我运行
test
视图,该视图在annotate()
中的Count()
中具有型号名称product
,如下所示。***型号名称product
**可以获取Product
模型中id
列的值:然后,在控制台上输出以下内容:
并且,
annotate()
可以接受多种函数,如下所示:然后,在控制台上输出以下内容: