import os
from django.core.wsgi import get_wsgi_application
if __name__=='__main__':
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "b20190116.settings")
application = get_wsgi_application()
# 聚合查询(一堆聚合函数,使用之前先导入)
from django.db.models import Count, Max, Min, Avg, Sum
# 查询所有书的平均价格
# ret=models.Book.objects.all().aggregate(aa=Avg('price'))
# print(ret)
# 可以一次使用多个
# ret=models.Book.objects.all().aggregate(Avg('price'),Max('price'),Sum('price'))
# print(ret.get('price__max'))
# print(ret['price__max'])
# print(ret)
# author = models.Author.objects.filter(pk=1)
# 现在author是queryset对象(是个容器类型)
# print(author)
# # # 拿出一个author对象
# print(type(author.first()))
# 查询每个部门下员工数
# SELECT partment,COUNT(nid) FROM app01_author GROUP BY partment
# 终极总结:
'''
group by 谁,就以谁做基表
values在前:表示group by
values在后:取值
filter在前:表示where条件
filter在后: 表示having
'''
# 单表
# ret=models.Author.objects.all().values('partment').annotate(c=Count('pk')).values('partment','c',)
# print(ret)
# 统计id小于10的每个部门的人数
# ret=models.Author.objects.all().filter(nid__lt=3).values('partment').annotate(Count('pk'))
# print(ret)
# 统计id小于10的并且部门的人数大于1的部门
# ret = models.Author.objects.all().filter(nid__lt=10).values('partment').annotate(cc=Count('pk')).filter(cc__gt=1).values('partment')
# print(ret)
# 练习:统计每一本书作者个数
ret = models.Book.objects.all().values('pk').annotate(c=Count('authors')).values('name', 'c')
print(ret.query)
print(ret)
# 默认按基表的id给group by
# ret=models.Book.objects.all().annotate(c=Count('authors')).values('name','c')
# print(ret)
# 统计每一个出版社的最便宜的书的出版社名字和书的价格
# 分组数数的表中的数据是不能取的
# ret=models.Publish.objects.all().values('pk').annotate(c=Count('book__price')).values('name','c')
# ret=models.Publish.objects.all().annotate(c=Count('book__price')).values('name','c')
# print(ret.query)
# print(ret)
# 练习:统计每一本以py开头的书籍的作者个数:group by 书
# ret=models.Book.objects.all().filter(name__startswith='红').annotate(sss=Count('authors__name')).values('name','sss')
# print(ret)
# 统计不止一个作者的图书:(作者数量大于一)
# ret=models.Book.objects.all().annotate(c=Count('authors')).filter(c__gt=1).values('name','c')
# ret=models.Book.objects.all().values('pk').annotate(c=Count('authors')).filter(c__gt=1).values('name','c')
# print(ret)
# 统计每一个出版社出版的书籍个数
# -不知道以谁做基表
# 1 红楼梦 12 1 北京出版社 北京
# 2 水浒传 13 1 北京出版社 北京
# 1 西游记 14 1 北京出版社 北京
#
# 1 三国 167 2 北京出版社 北京
# 1 北京出版社 1 红楼梦
# 1 北京出版社 2 水浒传 2
# -出版社名称:北京出版社 书的个数:2 书名:不能取
#
# 2 南京出版社 3 三国 1
# -出版社名称:南京出版社 书的个数:1 书名:
'''
保安部 1 lqz 18
保安部 2 egon 17
-部门:保安部 人数:2 人名:不能取
财务部 6 小猴 16
-部门:财务部 人数:1
'''
# 把红楼梦这本书的评论数+1
# ret=models.Book.objects.filter(name='红楼梦').update(commit_num+=1)
# F函数干什么用的?获取出某个字段的值
from django.db.models import F, Q
# ret=models.Book.objects.filter(name='红楼梦').update(commit_num=F('commit_num')+6)
# print(ret)
# 查询评论数大于阅读数2倍的书籍
# ret=models.Book.objects.all().filter(commit_num__gt=2*F('reat_num')).values('name')
# print(ret)
# Q查询 与 或 非
# 查询名字为红楼梦或者价格等44的书
# ret=models.Book.objects.all().filter(name='红楼梦',price='44')
# 或
# ret=models.Book.objects.all().filter(Q(name='红楼梦') | Q(price='44')).values('name')
# 与 就是and
# ret=models.Book.objects.all().filter(Q(name='红楼梦') & Q(price='44')).values('name')
# 非 名字不是红楼梦的书
# ret = models.Book.objects.filter(~Q(name='红楼梦'))
# ret = models.Book.objects.filter(~(Q(name='红楼梦') | Q(price='44')))
# print(ret)
# 基于对象的跨表查询
# book=models.Book.objects.get(pk=1)
#
# print(book.publish.name)
# 基于双下划线
# 查询书名为红楼梦的出版社名称
ret = models.Book.objects.all().filter(name='红楼梦').values('publish__name')
print(ret)