美文网首页
Django学习笔记

Django学习笔记

作者: lijun_m | 来源:发表于2017-11-14 11:38 被阅读0次

    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学习笔记

          本文链接:https://www.haomeiwen.com/subject/zedxvxtx.html