Django学习笔记

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 也能实现。

你可能感兴趣的:(Django学习笔记)