zoukankan      html  css  js  c++  java
  • Django 多表操作2

    创建表模型和多表操作1一样

    基于双下划线的一对多查询

    #查询出版社为北京出版社出版的所有图书的名字,价格
    	ret=Publish.objects.filter(name='北京出版社').values('book__name','book__price')
    	print(ret)
    	ret=Book.objects.filter(publish__name='北京出版社').values('name','price')
    	print(ret)
    #查询北京出版社出版的价格大于19的书
    	ret=Publish.objects.filter(name='北京出版社',book__price__gt=19).values('book__name','book__price')
        print(ret)
    

    基于双下划线的多对多查询

    #查询红楼梦的所有作者名字
    ret=Book.objects.filter(name='红楼梦').values('authors__name')
    print(ret)
    ret=Author.objects.filter(book__name='红楼梦').values('name')
    print(ret)
    #查询图书价格大于30的所有作者名字
    ret=Book.objects.filter(price__gt=30).values('authors__name')
    print(ret)
    

    基于双下划线的连续跨表查询

    #查询北京出版社出版过的所有书籍的名字以及作者的姓名
    ret=Publish.objects.filter(name='北京出版社').values('book__name','book__authors__name')
    print(ret)
    ret=Book.objects.filter(publish__name='北京出版社').values('name','authors__name')
    print(ret)
    #手机号以151开头的作者出版过的所有书籍名称以及出版社名称
    ret=AuthorDetail.objects.filter(phone__startswith='13').values('author__book__name','author__book__publish__name')
    print(ret)
    ret=Book.objects.filter(authors__authordetail__phone__startswith='13').values('name','publish__name')
    print(ret)
    

    聚合查询aggregate

    from django.db.models import Avg,Count,Max,Min,Sum
    #计算所有图书的平均价格
    ret=Book.objects.all().aggregate(Avg('price'))
    print(ret)
    #计算图书的最高价格
    ret=Book.objects.all().aggregate(Max('price'))
    print(ret)
    #aggregate是queryset的终止子句
    #计算图书的最高价格,最低价格,平均价格,总价
    ret=Book.objects.all().aggregate(Max('price'),Min('price'),Avg('price'),Sum('price'))
    print(ret)
    

    分组查询annotate

    #统计每一本书作者个数
    ret=Book.objects.all().annotate(c=Count('authors'))
    print(ret)
    for r in ret:
        print(r.name,'---->',r.c)
    
    ret=Book.objects.all().annotate(c=Count('authors')).values('name','c')
    print(ret)
    #统计每一个出版社的最便宜的书(以谁group by 就以谁为基表)
    ret=Publish.objects.all().annotate(m=Min('book__price')).values('name','m')
    print(ret)
    #统计每一本以py开头的书籍的作者个数
    ret1=Book.objects.all().filter(name__startswith='py').annotate(c=Count('authors')).values('name','c')
    print(ret1)
    
    #总结:  group by 谁,就以谁做基表,filter过滤,annotate取分组,values取值
    #总结终极版本
    #values在前,表示group by 在后,表示取值
    #filter在前,表示where条件,在后表示having
    
    #统计每一本以py开头的书籍的作者个数--套用模板
    ret2=Book.objects.all().values('name').filter(name__startswith='py').annotate(c=Count('authors')).values('name','c')
    print(ret2)
    #查询各个作者出的书的总价格
    ret=Author.objects.all().values('name').annotate(s=Sum('book__price')).values('name','s')
    ret=Author.objects.all().annotate(s=Sum('book__price')).values('name','s')
    print(ret)
    #查询名字叫lqz作者书的总价格
    ret=Author.objects.all().values('pk').filter(name='lqz').annotate(s=Sum('book__price')).values('name','s')
    print(ret)
    #查询所有作者写的书的总价格大于30
    ret=Author.objects.all().values('pk').annotate(s=Sum('book__price')).filter(s__gt=2).values('name','s')
    ret=Author.objects.all().annotate(s=Sum('book__price')).filter(s__gt=30).values('name','s')
    print(ret)
    
    #总结终极版本
    #values在前,表示group by 在后,表示取值
    #filter在前,表示where条件,在后表示having
    
    #统计不止一个作者的图书
    ret=Book.objects.all().values('pk').annotate(c=Count('authors')).filter(c__gt=1).values('name','c')
    print(ret)
    
    总结: group by 谁,就以谁做基表,filter过滤,annotate取分组,values取值
    总结终极版本
    values在前,表示group by 在后,表示取值
    filter在前,表示where条件,在后表示having
  • 相关阅读:
    年末deadline汇总
    [线性代数]2016.12.19周一作业
    [线性代数]2016.12.15周四作业
    Android SDK的安装与环境变量的配置
    安装JDK环境变量的配置
    Python中单引号,双引号,三引号
    带有支付功能的产品如何进行测试
    Android稳定性测试工具Monkey的使用
    mysql数据库单表增删改查命令
    svn
  • 原文地址:https://www.cnblogs.com/layerluo/p/9960417.html
Copyright © 2011-2022 走看看