生成值的汇总的另一个办法是为 QuerySet
的每一个对象生成独立汇总。比如,如果你想检索书籍列表,你可能想知道每一本书有多少作者。每一本书与作者有多对多的关系;我们想在 QuerySet
中为每一本书总结这个关系。
使用 annotate()
子句可以生成每一个对象的汇总。当指定 annotate()
子句,QuerySet
中的每一个对象将对指定值进行汇总。
这些语法与用于 aggregate()
子句的语法相同。 annotate() 的每个参数都描述了一个要计算的聚合。 例如,用作者数量注释书籍:
# Build an annotated queryset
>>> from django.db.models import Count
>>> q = Book.objects.annotate(Count("authors"))
# Interrogate the first object in the queryset
>>> q[0]
<Book: The Definitive Guide to Django>
>>> q[0].authors__count
2
# Interrogate the second object in the queryset
>>> q[1]
<Book: Practical Django Projects>
>>> q[1].authors__count
1
与 aggregate()
一样,注解的名称是根据聚合函数和被聚合的字段名自动生成的。当你在指定注解的时候,你可以通过提供一个别名重写这个默认名:
>>> q = Book.objects.annotate(num_authors=Count("authors"))
>>> q[0].num_authors
2
>>> q[1].num_authors
1
与 aggregate()
不同的是,annotate()
不是终端子句。annotate()
子句的输出就是 QuerySet
;这个 QuerySet
被其他 QuerySet
操作进行修改,包括 filter()
, order_by()
,甚至可以对 annotate()
进行额外调用。
将多个聚合与 annotate()
组合会产生错误的结果,因为使用的是连接而不是子查询:
>>> book = Book.objects.first()
>>> book.authors.count()
2
>>> book.store_set.count()
3
>>> q = Book.objects.annotate(Count("authors"), Count("store"))
>>> q[0].authors__count
6
>>> q[0].store__count
6
对大部分聚合来说,没办法避免这个问题,但是,Count
聚合可以使用 distinct
参数来避免:
>>> q = Book.objects.annotate(Count("authors", distinct=True), Count("store", distinct=True))
>>> q[0].authors__count
2
>>> q[0].store__count
3
为什么 Django 使用自动提交在 SQL 规范中,每一个 SQL 查询会启动事务,除非一个事务已经处于活动状态。然后必须显式地提交或回...
WebSecurity - IsCurrentUser()WebSecurity 对象定义 IsCurrentUser() 方法把提供的用户名与已登录用户的用户名进行比较。C# 和 ...
WebSecurity 属性 - IsAuthenticatedWebSecurity 对象定义 IsAuthenticated 属性是一个布尔值,指示当前用户是否已通过身份验证...
ASP.NET TableRow HorizontalAlign 属性 TableRow 控件定义和用法 HorizontalAlign 属性用于设置或返回 TableRow 控件中内容的水...
ASP.NET HyperLink NavigateUrl 属性 HyperLink 控件定义和用法 NavigateURL 属性用于设置或返回 HyperLink 控件的 URL。 语法as...
ASP.NET Height 属性 Web 控件标准属性参考手册定义和用法 Height 属性用于设置或返回控件的高度。 语法asp:webcontrol id="id" ...
grid.tooltip.position |string, Array, Function提示框浮层的位置,默认不设置时位置会跟随鼠标的位置。可选:Array通过数组表...
xAxis.axisPointer.label.textStyle |boolean对 xAxis 中的坐标轴指示器文本标签的文本样式进行设置xAxis.axisPointer.label.tex...
在使用 ECharts 图表的时候,我们可以通过 yAxis.splitLine 来给 y 轴在 grid 区域中添加一条分隔线,利用这条分隔线将区分坐标...