zoukankan      html  css  js  c++  java
  • 使用聚合函数及F/Q及分组查询

    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)
  • 相关阅读:
    code of C/C++(2)
    code of C/C++ (1)
    dll 的编写和使用
    Python基础练习-数据类型与变量part2
    Python基础练习-数据类型与变量
    python基础练习-循环
    Linux grep
    nginx反向代理
    正则表达式
    Linux samba ing
  • 原文地址:https://www.cnblogs.com/zhouhai007/p/10279582.html
Copyright © 2011-2022 走看看