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)