zoukankan      html  css  js  c++  java
  • django之多表查询-2

    2018-11-14
    一  \  基于双下划线的跨表查询:
              套路一样,用__跨表
            -一对多
            -多对多

    from app.models import * 查询出版社为北京出版社出版的所有图书的名字,价格 ret
    =Publish.objects.filter(name='北京出版社').values('book__name','book__price')


    查询红楼梦的所有作者名字
    ret=Book.objects.filter(name='红楼梦').values('authors__name')

    进阶练习--连续跨表
    查询北京出版社出版过的所有书籍的名字以及作者的姓名
    ret=Publish.objects.filter(name='北京出版社').values('book__name','book__authors__name')

    二 \ 聚合查询
    from django.db.models import Avg,Count,Max,Min,Sum
    1.计算所有图书的平均价格
    ret = Book.objects.all().aggregate(Avg('price')) #可以省略all()
    print(ret)
    2. 计算图书的最高价格
    ret = Book.objects.aggregate(Max('price'))
    print(ret)
    3. 计算图书的最高价格,最低价格,平均价格,总价
    ret = Book.objects.aggregate(Max('price'),Min('price'),Avg('price'),Sum('price'))
    print(ret)


    三 \ 分组查询
    终极总结: values在前,表示group by,在后,表示取值 filter在前,表示过滤(where),在后,表示having(对分组之后的结果再进行过滤)
    1.统计每一本书作者个数
    ret = Book.objects.annotate(c=Count('authors')).values('name','c')
    print(ret)

    2.统计每一个出版社的最便宜的书(以谁group by 就以谁为基表)
    ret = Publish.objects.annotate(m=Min('book__price')).values('name','m')
    print(ret)

    3.统计每一本以py开头的书籍的作者个数
    ret = Book.objects.filter(name__startswith='py').annotate(m=Count('authors')).values('name','m')
    print(ret)

    4.查询各个作者出的书的总价格
    ret = Author.objects.annotate(m=Sum('book__price')).values('name','m')
    print(ret)

    5.查询名字叫lqz作者书的总价格
    ret = Author.objects.filter(name='lqz').annotate(m=Sum('book__price')).values('name','m')
    print(ret)

    6.查询所有作者写的书的总价格大于30
    ret = Book.objects.annotate(s=Sum('authors__book__price')).filter(s__gt=900).values('authors__name','s')
    print(ret)

    四 \ F查询与Q查询
    F查询 
    1.查询评论数大于阅读数的书
    ret = Book.objects.filter(commit_num__gt=F('read_num'))
    print(ret)

    2.把所有书的评论数加1
    ret = Book.objects.update(commit_num=F('commit_num') + 1)

    3.python这本书的阅读数减5
    ret = Book.objects.update(read_num=F('read_num')-5)

    Q函数 为了表示与& ,或 | ,非 ~

    # 1.查询作者名字是lqz或者名字是egon的书
    ret = Book.objects.all().filter(Q(authors__name='zjh') | Q(authors__name='egon')).values('name')
    print(ret)

    # 2.查询作者不是zjh的书
    ret = Book.objects.all().filter(~Q(authors__name='zjh')).values('name')
    print(ret)




    
    
    ret = Publish.objects.filter(name='北京出版社').values('name','book__name','book__authors__name')
  • 相关阅读:
    vue.js中created方法作用
    UasyUi的各种方法整理
    echarts 3.8.4: tree设置节点与节点之间连线的颜色,可以独立每条线分开设置
    echarts中的树形结构图(参数分析)
    echarts y轴数据如果太大就会造成坐标轴显示不完全的问题
    echarts 网络拓扑告警闪烁及提示信息自定义
    echarts 树图问题
    echarts grid多格显示问题
    echarts中自定义tooltip的换行问题
    yarn install 安装报错问题
  • 原文地址:https://www.cnblogs.com/zhaijihai/p/9959940.html
Copyright © 2011-2022 走看看