聚合查询 分组 F与Q查询
Posted lddraon1
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了聚合查询 分组 F与Q查询相关的知识,希望对你有一定的参考价值。
一.orm补充查询
聚合查询 1-1
? Max
Min
Sum
Avg
Count
? 在mysql
中聚合函数必须用在分组之后的 没有分组其实默认整体就是一组
? 在django
中如果想使用聚合函数必须先使用 关键字 aggregate
? 还需要导入模块
from django.db.models import Max, Min, Avg, Sum, Count
# 温馨提示 只要跟数据库有关的功能 基本都在 db.models里面 或者 db里面
? 使用方法:
1.赛选出价格最高的书籍
book_obj = models.Book.object.aggregate(mr=Max('price'))
print(book_obj) # 拿到是一个字典 key为mr mr就是价格
2.求书籍总价
book_obj = models.Book.object.aggregate(sm=Sum('price'))
print(book_obj) # {'sm': Decimal('15999.99')}
3.全部一起使用 # 不起名字
book_obj = models.Book.object.aggregate(Max('price'),Sum('price'),..... )
# 返回字典的key 是 查询的字段+__聚合函数
分组查询 1-2
? mysql中使用的group_by
? 那么什么时候需要分组? 例如:统计每个部门的平均薪资 统计每一个部门的男女比例
? django里面使用分组: 1.关键字 annotate
? 2.借助于聚合函数
from django.db.models import Max, Min, Avg, Sum, Count
# 统计每一本书的作者个数
res = models.Book.objects.annotate(author_nmu=Count('authors__id'))
print(res) # 返回queryset对象 是个列表
# 统计每一本书的作者个数 书名 和 数量
res = models.Book.objects.annotate(author_num=Count('authors__id')).values('title',author_num)
# author_num 指代的就是作者的个数
# 统计出每个出版社卖的最便宜的价格 出版社名称 图书书名
res = models.Publish.objects.annotate(mi=Min('book__price')).values('name', 'book__titile')
? 严格模式 分组之后只能拿分组后的依据 如果想拿 必须通过聚合函数来获取
? 可以取消严格模式
# 统计不止一个作者的图书
1. 先拿到书及对应的作者数
2. 赛选出大于一的图书
res = models.Book.objects.annotate(author_num=Count('author')).filter(author_num__gt=1).values('title','author_num')
print(res)
# 统计各个作者的图书总价格 作者名字 价格
res = models.Author.object.annotate(su=Sum('book_price')).values('name', 'su')
? 想要分组的字段 之间点values
res = models.Author.object.values('title')annotate(su=Sum('book_price')).values('name', 'su')
F与Q查询 1-3
# 模块导入
from django.db.models import F
# 1 查询库存数大于卖出数的书籍
res = models.Book.objects.filter(kun_cun__gt=F('mai_chu')).values('title')
# 后面的条件是来自于数据库的其他字段
# 2 将所有书的价格上加100元
res = models.Book.objects.all().update(price=F('price') + 100)
# 3 所有书的书名后添加 爆款
res = models.Book.objects.all().update(price=Concat(F('price') + '爆款'))
# 字符串必须使用Concat 了解知识点
# 模块导入
from django.db.models import Q
# 查询一下书籍名称是三国演艺 或者 库存是500的书籍
# filter 内只能是 and关系
res = models.Book.objects.filter(Q(tilte='三国演义'), Q(kun_cun=500)) # , 号还是 and
res = models.Book.objects.filter(Q(tilte='三国演义')|Q(kun_cun=500)) # | 就是 or
res = models.Book.objects.filter(`Q(tilte='三国演义')|Q(kun_cun=500)) # not 关系 取反 esc下面的波浪
? Q对象高级用法
# 类似于搜索功能
q = Q() # 生成对象
q.children.append(('title', '三国演义')) # 一定要是元组
q.children.append(('kun_cun', 500))
res = models.Book.objects.filter(q) # 默认是 and关系
res = models.Book.objects.filter(`q) # 取反
# 方法
q.connector = 'or' # 指定为or (*******)
以上是关于聚合查询 分组 F与Q查询的主要内容,如果未能解决你的问题,请参考以下文章
Django框架08 /聚合查询分组F查询和Q查询执行原生sql设置 sql_mode