• (21)模型层 -ORM之msql 聚合查询,F和Q(与、或、非查询)、分组查询


    什么是聚合查询,就是使用聚合函数做计算

    from django.db.models import Count,Avg,Max,Min   #聚合函数要从模块中导入

    from django.db.models import F,Q   #与或非得 查询需要从模块倒入F和Q

    聚合查询

    需求 计算所有书的价格
    from django.db.models import Count,Avg,Max,Min,Sum #聚合函数要从模块中导入
    ret = models.Book.objects.all().aggregate(Avg('price')) #查询出所有的书然后用聚合函数做平均价格
    ret = models.Book.objects.all().aggregate(Max('price')) #计算最大的价格
    ret = models.Book.objects.all().aggregate(Min('price')) #计算最小价格
    ret = models.Book.objects.all().aggregate(Count('price')) #计算书的总数
    ret = models.Book.objects.all().aggregate(Sum('price')) #计算所有数的总价

    F和Q查询

    # F就是去除表中字段对应的值
    # 查询评论数大于阅读数的书
    ret=models.Book.objects.filter(commit_num_gt=F('read_num')) #F包裹的就是相当于直接获值取
    # 需求把所有评论数加1
    ret= models.Book.objects.all().update(commit_num=F('commit_num')+1)

    # Q查询就是构造出 与& 或| 非 ~ 得关系
    ret = models.Book.objects.filter(name='红楼梦',price=20) #这个就是和与&一样的写法
    ret = models.Book.objects.filter(Q(name='红楼梦') | Q(price=20)) #这个就是或,名字是红楼梦或者价格是20
    ret = models.Book.objects.filter(~Q(name='红楼梦'),price=20) #非就是不是红楼价格是20的

    分组查询:用的annotate函数

    需求:统计每一本书的作者个数

    PS:这个就是多表查询的统计了

    group_by谁就是以谁做基表(就是以什么表为基表或字段为依据)

    values在annotate函数前,表示group_by, values在annotate后面的表取值

    filter在annotate函数前,表示where(就是过滤条件,查找以过滤条件为开头的数据),在后表示having

    from app01 import models
    from django.db.models import Avg,Max,Sum,Min,Max,Count
    '''# 统计每本书作者的个数,以书做分组,然后统计书里面的作者,这个取基表中的任意字段,这里去的是主键'''
    ret = models.Book.objects.all().values('pk').annotate(author_num=Count("authors")).values('name','author_num')
    ''' models.Book.objects.all()就是我要group_by的,以book表做基表 values('pk) 就是表示group_by那个字段 annotate就是开始分组然后统计分组字段的个数就是数作者做个 values就取值,是把书的名字和个数取出)'''

    '''统计以过滤条件为开头的书的作者的个数'''
    rets = models.Book.objects.all().values('pk').filter(name__startswith='红楼').annotate(author_num=Count("authors")).values('name','author_num')
    ''' models.Book.objects.all()就是以书为基表 values('pk')就是表示group_by那个字段 过滤了书名是红楼开头的,所以将红楼开头的全部获取到 、 annotate就是开始分组然后统计分组字段的个数就是数作者做个 values就取值,是把书的名字和个数取出) '''

    '''统计每本书的作者个数大于1的书'''
    retss = models.Book.objects.all().values('pk').annotate(author_num=Count("authors")).filter(author_num__gt=1).values('name', 'author_num')
    '''models.Book.objects.all()就是以书为基表 values('pk')就是表示group_by那个字段 annotate就是开始分组然后统计分组字段的个数,就是数作者做个 filter(author_num__gt=1)就author_num是字段大于等于1 values就取值,是把书的名字和作者大于1的取出)'''

    '''查询每个作者出版的书的总价'''
    retsss = models.Author.objects.all().values('pk').annotate(m=Sum('book__price')).values('name','m')
    ''' 以作者为基表 取主键 开始分组 变量m=反向用表名小写__字段 取值 作者名字和总价'''

    '''查询各个作者出版的书的总价大于25的作者'''
    retssss = models.Author.objects.all().values('pk').annotate(m=Sum('book__price')).values('name','m')

    PS:retssss = models.Author.objects.all().annotate(m=Sum('book__price')).values('name','m') #annotate前values如果不写默认以基表的主键作为group_by的字段
  • 相关阅读:
    Cheatsheet: 2013 12.01 ~ 12.16
    Cheatsheet: 2013 11.12 ~ 11.30
    Cheatsheet: 2013 11.01 ~ 11.11
    Cheatsheet: 2013 10.24 ~ 10.31
    Cheatsheet: 2013 10.09 ~ 10.23
    Cheatsheet: 2013 10.01 ~ 10.08
    Cheatsheet: 2013 09.22 ~ 09.30
    Cheatsheet: 2013 09.10 ~ 09.21
    Cheatsheet: 2013 09.01 ~ 09.09
    Cheatsheet: 2013 08.20 ~ 08.31
  • 原文地址:https://www.cnblogs.com/shizhengquan/p/10528655.html
Copyright © 2020-2023  润新知