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) 

原创文章,作者:ItWorker,如若转载,请注明出处:https://blog.ytso.com/20825.html

(0)
上一篇 2021年7月19日
下一篇 2021年7月19日

相关推荐

发表回复

登录后才能评论