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

时间:2021-12-14 15:09:39

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")