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
  • 相关阅读:
    P1144 最短路计数 题解 最短路应用题
    C++高精度加减乘除模板
    HDU3746 Teacher YYF 题解 KMP算法
    POJ3080 Blue Jeans 题解 KMP算法
    POJ2185 Milking Grid 题解 KMP算法
    POJ2752 Seek the Name, Seek the Fame 题解 KMP算法
    POJ2406 Power Strings 题解 KMP算法
    HDU2087 剪花布条 题解 KMP算法
    eclipse创建maven项目(详细)
    maven的作用及优势
  • 原文地址:https://www.cnblogs.com/layerluo/p/9960417.html
Copyright © 2011-2022 走看看