聚合,分组,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)))

 

posted @ 2020-08-21 14:50  Sunny抹茶  阅读(106)  评论(0)    收藏  举报