07.aggregate和annotate

01.aggregate聚合函数

  • **作用:**从数据库中取出一个汇总的集合
  • aggregate求最大值、最小值、平局值等
from django.db.models import Count,Avg,Max,Sum
def orm(request):

    stus = models.Student.objects.aggregate(
        stu_num=Count('age'),     #计算学生表中有多少条age条目
        stu_avg=Avg('age'),       #计算学生的平均年纪
        stu_max=Max('age'),       #找到年纪最大的学生
        stu_sum=Sum('age'))       #将表中的所有年纪相加

    print('stu',stus)
    return HttpResponse('ok')
#运行结果:{'stu_sum': 69, 'stu_max': 24, 'stu_avg': 23.0, 'stu_num': 3}

02.annotate实现聚合group by查询

  • **作用:**对查询结果进行分组,比如分组求出各年龄段的人数
  • 注: annotate后面加filter过滤相当于原生sql语句中的having
from django.db.models import Count, Avg, Max, Min, Sum
def orm(request):
    #1 按年纪分组查找学生表中各个年龄段学生人数:(22岁两人,24岁一人)
    # 查询结果:[{'stu_num': 2, 'age': 22}, {'stu_num': 1, 'age': 24}]

    stus1 = models.Student.objects.values('age').annotate(stu_num=Count('age'))

    #2 按年纪分组查找学生表中各个年龄段学生人数,并过滤出年纪大于22的:
    # 查询结果:[{'stu_num': 1, 'age': 24}] (年级大于22岁的仅一人,年级为24岁)

    stus2 = models.Student.objects.values('age').annotate(stu_num=Count('age')).filter(age__gt=22)

    #3 先按年纪分组,然后查询出各个年龄段学生的平均成绩
    # 查询结果:[{'stu_Avg': 86.5, 'age': 22}, {'stu_Avg': 99.0, 'age': 24}]
    # 22岁平均成绩:86.5      24岁平均成绩:99

    stus3 = models.Student.objects.values('age').annotate(stu_Avg=Avg('grade'))

    return HttpResponse('ok')

03.aggregate和annotate区别

  • Aggregate作用是从数据库取出一个汇总的数据(比如,数量,最大,最小,平均等)
  • 而annotate是先按照设定的条件对数据进行分组,然后根据不同组分别对数据进行汇总
posted @ 2021-05-20 11:19  小虾米爱吃鱼  阅读(75)  评论(0编辑  收藏  举报