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)