Django 聚合
- 在查询集上生成聚合(aggregate)
aggregate()是QuerySet 的一个终止子句,意思是说,它返回一个包含一些键值对的字典。键的名称是聚合值的标识符,值是计算出来的聚合值。键的名称是按照字段和聚合函数的名称自动生成出来的。如果你想要为聚合值指定一个名称,可以向聚合子句提供它。1
2>>> Book.objects.aggregate(average_price=Avg('price'))
{'average_price': 34.35} - 为查询集的每一项生成聚合(annotate)
逐个对象的汇总结果可以由annotate()子句生成。当annotate()子句被指定之后,QuerySet中的每个对象都会被注上特定的值。
这些注解的语法都和aggregate()子句所使用的相同。annotate()的每个参数都描述了将要被计算的聚合。比如,给图书添加作者数量的注解:和使用 aggregate()一样,注解的名称也根据聚合函数的名称和聚合字段的名称得到的。你可以在指定注解时,为默认名称提供一个别名:1
2
3
4
5
6
7
8
9
10
11
12
13# 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
1 | >>> q = Book.objects.annotate(num_authors=Count('authors')) |
与 aggregate() 不同的是, annotate() 不是一个终止子句。annotate()子句的返回结果是一个查询集 (QuerySet);这个 QuerySet可以用任何QuerySet方法进行修改,包括 filter(), order_by(), 甚至是再次应用annotate()。