• Django的mode的分组查询和聚合查询和F查询和Q查询


    1、聚合查询

     # 聚合函数aggregate,求指定字段的最大值,最小值,平均值,和的值,方法如下
    
        from django.db.models import Avg
        from django.db.models import Sum
        from django.db.models import Max
        from django.db.models import Min
    
        obj = models.book.objects.all().aggregate(Avg("Book_price"))
        print(obj)
    
        obj = models.book.objects.all().aggregate(Sum("Book_price"))
        print(obj)
    
        obj = models.book.objects.all().aggregate(Max("Book_price"))
        print(obj)
    
        obj = models.book.objects.all().aggregate(Min("Book_price"))
        print(obj)
    

      

    2、分组查询

        # 分组查询
        # 首先把书籍通过作者进行分组,然后求每个作者的书的价格的平均值
        obj = models.book.objects.all().values("Book_Auther").annotate(Avg("Book_price"))
        print(obj)
    

      

    3、F查询和Q查询

    我们先提出一个问题,就是我们要把书这张表中的所有书的价格都加1000,该如何实现呢?我们可以用下面的方法实现

        id_list = models.book.objects.all().values_list("id")
        # obj = models.book.objects.all()
        for i in id_list:
            new_price = models.book.objects.filter(id=i[0])[0].Book_price + 1000
            models.book.objects.filter(id=i[0]).update(Book_price=new_price)
    

      

     # id_list = models.book.objects.all().values_list("id")
        # # obj = models.book.objects.all()
        # for i in id_list:
        #     new_price = models.book.objects.filter(id=i[0])[0].Book_price + 1000
        #     models.book.objects.filter(id=i[0]).update(Book_price=new_price)
    
    
    
        # F查询作用很局限,就是对某列的数据做操作,比如我们为价格这一列全部加10000,只能对数字列做操作,而且不能使用双下划线的属性
        from django.db.models import F
        # models.book.objects.all().update(Book_price=F("Book_price")+10000)
    
    
        # Q查询:我们之前查询的规则,比如filter中的规则,虽然可以写多个过滤条件,但是这些条件只能是and的关系,如果是or的关系,fileter就做不到了
        # 这里就需要用到Q查询
    
        # Q方法取或用“|”,去交集用 “&”
        from django.db.models import Q
        # 比如我们用到id大于5,或者价格大于10000的对象,或方法用一个管道符的方法
    
        # 取并集
        obj = models.book.objects.filter(Q(Book_price__gt=11000)|Q(id=2))
        print(obj.values("Book_price","id"))
    
        # 去交集
        obj = models.book.objects.filter(Q(Book_price__gt=11000) & Q(id=2))
    
        # Q查询和字段查询可以混合使用,但是字段必须要放在最后
        obj = models.book.objects.filter(Q(Book_price__gt=11000) & Q(id=2),Book_info__contains="aaaa")
        return HttpResponse("test5")
    

      

     传入条件查询

    q1 = Q()
    q1.connector = 'OR'
    q1.children.append(('id', 1))
    q1.children.append(('id', 2))
    q1.children.append(('id', 3))
        
    models.Tb1.objects.filter(q1)
    

    合并条件查询

    con = Q()
    
    q1 = Q()
    q1.connector = 'OR'
    q1.children.append(('id', 1))
    q1.children.append(('id', 2))
    q1.children.append(('id', 3))
    
    q2 = Q()
    q2.connector = 'OR'
    q2.children.append(('status', '在线'))
    
    con.add(q1, 'AND')
    con.add(q2, 'AND')
    
    models.Tb1.objects.filter(con)
    
  • 相关阅读:
    无参装饰器
    针对硬盘大于2TB,centos7系统安装问题说明
    Java与Python擅长领域
    Java数据类型
    编译型语言与解释型语言,强类型语言与弱类型语言,动态类型语言与静态类型语言
    Butterfly透明背景设置
    虚拟机重装系统
    手动删除软件垃圾
    清理C盘
    Gitee+HEXO搭建个人博客
  • 原文地址:https://www.cnblogs.com/bainianminguo/p/9080275.html
Copyright © 2020-2023  润新知