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
相关文章
相关标签/搜索