今日内容概要
- 聚合查询
- 分组查询
- F与Q查询
今日内容详细
聚合查询
'''
MySQL中常用的聚合函数
Max Min Sum Count Avg
需要结合分组一起使用
'''
在ORM中支持单独使用聚合函数通过aggregate实现
# 导入聚合函数
from django.db.models import Max, Min, Sum, Count, Avg
# 使用方法
res = models.Book.objects.aggregate(Max('price')
#并且支持重命名
res = models.Book.objects.aggregate(Max('price'), 平均价格=Avg('price'))
分组查询
'''
当使用ORM分组查询报错 并且报错信息中有关键字sql_mode strict mode等
只需要移除sql_mode中的only_full_group_by即可
'''
models.表名.objects.annotate() 按表分组
1.统计每一本书的作者个数
res = models.Book.objects.annotate(author_num=Count('author_pk')).values('name', 'author_num')
2.统计出每个出版社卖的最便宜的书的价格
res = models.Publish.objects.annotate(min_price=Min('book__price')).values('name', 'min_price')
3.统计不止一个作者的图书
先统计每本书的作者个数
res = models.Book.objects.annotate(author_count=Count('author__pk'))
再筛选作者个数大于1的数据
res = models.Book.objects.annotate(author_count=Count('author__pk')).values('name', 'author_count')
4.查询每个作者出的书的总价格
res = models.Author.objects.annotate(all_price=Sum('book__price')).values('name', 'all_price')
'''
不仅可以按表分组 也可以按字段分组
models.表名.objects.values('字段名').annotate()
values放在annotate前面是告诉annotate按照指定字段分组 在后面就是取值
'''
F与Q查询
'''
F查询就是当查询条件不是明确的 也需要从数据库中获取 那么就会用到F查询
Q查询就是将查询条件变为or或者not 默认的查询条件为and
'''
# 需要先导入
from django.db.models import F, Q
1.查询库存数量大于卖出数量的书籍
res = models.Book.objects.filter(kucun__gt=F('maichu'))
2.将所有的书价格上涨100
res = models.Book.objects.update(price=F('price') + 100)
3.将所有的书名后面追加爆款
# 对于字符串的拼接也需要导入额外的模块
from django.db.models.functions import Concat
from django.db.models import Value
models.Book.objects.update(name=Concat(F('name'), Value('爆款')))
4.查询主键是1或者价格大于200的书籍
# 条件之间用竖杠隔开 用逗号的话还是and关系
res = models.Book.object.filter(Q(pk=1) | Q(price__gt=200))
# 在条件前面加波浪号就是not ~
res = models.Book.object.filter(~Q(pk=1) | Q(price__gt=200))
标签:Book,框架,models,res,price,Django,objects,查询
From: https://www.cnblogs.com/lzjjjj/p/17019907.html