聚合,分组,F查询,Q查询
聚合,分组,F查询,Q查询
聚合查询:
django 会返回一个字典对象
select avg(price) and max(price) from app01_book
from django.db.models import Avg,Max,Min,Sum,Count obj = models.Book.objects.all().aggregate(a=Avg('price'),m =max('price')) # {'a':2.22,'m':3}
分组查询
sql 中通过group by 关键字进行分组查询,通过特定的关键字来进行分组
select avg(price) from app01_book GROUP BY publish_id
# 分组 # 统计出版社出版的书籍的平均价格 from django.db.models import Avg models.Book.objects.values('publishs_id').annotate(a=Avg('price'))
# publish_id 为分组字段,price 为分组后需要的结果 # [{'publish_id':2,'a':3},{'publish_id':3,'a':3.3}]
# 双下划线分组反向查询,默认以表的id 分组 models.Publish.objects.annotate(a=Avg('book__price')) # 返回一个publish 的QuerySet对象,里面额外包括一个字段a,可以通过加上 .values('a') 来获取
F查询
# F查询 应用于单表数据的查询以及比较 from django.db.models import F # 寻找点赞数(good)大于评论数(comment)的Book 返回queryset 对象 models.Book.objects.filter(good_gt = F('comment')) # 支持四则运算(寻找点赞数(good)大于评论数(comment)+20的Book) models.Book.objects.filter(good_gt=F('comment'+20)) # 支持自增(让书籍表中所有书的price 全都+20) models.Book.objects.all().update(price = F('price')+20)
Q查询
对于Q查询,将操作的结果以Q包裹,既可以使用Q提供的运算符,分别为:
- | 或
- & 和
- ~ 取反
对此,可以用集合的交并补来理解,以下为例子,当然,也可以用更加复杂的运算
# Q查询 from django.db.models import Q # 查询评论数(comment)和点赞数(good)大于100 models.Book.objects.filter(good_gt = 100,comment_gt = 100)#QuerySet对象 # 查询评论数(comment)或者点赞数(good)大于100 models.Book.objects.filter(Q(good_gt=100)| Q(comment_gt=100)) # QuerySet对象 #查询评论数(comment)和点赞数(good)大于100 models.Book.objects.filter(Q(good_gt=100) & Q(comment_gt=100)) # QuerySet对象 # 查询点赞数小于等于100的 models.Book.objects.filter(~Q(good_gt=100)) # QuerySet对象
Q查询的嵌套:
# Q查询 嵌套 查询评论数(comment)>100并且 点赞数(good)>100 并且价格(price) = 25 models.Book.objects.filter(Q(Q(good_gt=100)&Q(comment_gt = 100) | Q(price = 25)))
大三党,大家有问题可以多多建议
浙公网安备 33010602011771号