1.Django Aggregation聚合
#平均值
from django.db.models import Avg
Book.objects.all().aggregate(Avg('price'))
#最大值
from django.db.models import Max
Book.objects.all().aggregate(Max('price'))
# 为每个publisher添加个num_books属性,即每个pulisher出版的book的数量.
from django.db.models import Count
pubs=Publisher.objects.annotate(num_books=Count('book'))
Django有两种方法来生成聚合
第一种方法是为整个QuerySet生成聚合值:
函数aggregate()的参数是一系列聚合函数aggregate functions:
第二种是为查询集的每个对象生成聚合值
每个对象的总结可以用方法annotate()生成
django 中 annotate和aggregate的区别:
aggregate 计算整个queryset的值,相当于count(). Annotate 对于 queryset 中的每个值在指定的属性上进行汇总,相当于group_by.
values():注解annotate是添加到每一个对象上的,一个执行了注解操作的查询集 QuerySet 所返回的结果中,每个对象都添加了一个注解值。但是,如果使用了values()从句,它就会限制结果中列的范围,对注解赋值的方法就会完全不同。就不是在原始的 QuerySet 返回结果中对每个对象中添加注解,而是根据定义在 values() 从句中的字段组合对先结果进行唯一的分组,再根据每个分组算出注解值,这个注解值是根据分组中所有的成员计算而得的
values_list 获取元组形式结果
2.1 比如我们要获取作者的 name 和 qq
authors = Author.objects.values_list('name', 'qq')
如果只需要 1 个字段,可以指定flat=True
Author.objects.values_list('name',flat=True)
3. values 获取字典形式的结果
3.1 比如我们要获取作者的 name 和 qq
Author.objects.values('name', 'qq')
注意:
1. values_list 和 values 返回的并不是真正的 列表 或 字典,也是 queryset,他们也是 lazy evaluation 的(惰性评估,通俗地说,就是用的时候才真正的去数据库查)
2. 如果查询后没有使用,在数据库更新后再使用,你发现得到在是新内容!!!如果想要旧内容保持着,数据库更新后不要变,可以 list 一下
3. 如果只是遍历这些结果,没有必要 list 它们转成列表(浪费内存,数据量大的时候要更谨慎!!!)
4. extra 实现 别名,条件,排序等
extra 中可实现别名,条件,排序等,后面两个用 filter, exclude 一般都能实现,排序用 order_by 也能实现。