orm(中)
内容概要
- 聚合查询
- 分组查询
- F与Q查询
聚合查询
聚合函数
最大值 最小值 求和 统计 平均值
from django.db.models import Max, Min, Sum, Count, Avg
# 获取书中价格最高的
"""
在mysql中 我们会先连表 然后按作者分组 然后去拿书名
"""
res = models.Book.objects.aggregate(Max('price'))
print(res)
res = models.Book.objects.aggregate(max_price=Max('price')).get('max_price')
"""还可以起别名 然后 在get 如果你不起别名 django 会自动给你起一个"""
print(res)
# 书的价格最低的
res = models.Book.objects.aggregate(Min('price'))
print(res)
# 全部书的总价格
res = models.Book.objects.aggregate(Sum('price'))
print(res)
# 现在有几本书
res = models.Book.objects.aggregate(Count('pk'))
print(res)
# 所有书的平均价格
res = models.Book.objects.aggregate(Avg('price'))
print(res)
分组查询
"""
如果执行ORM分组查询报错 并且有关键字sql_mode stric mode
移除sql_mode 中的 only_full_group_by
"""
from django.db.models import Count, Sum, Max, Min, Avg
# 统计每本书的作者个数
"""
在MySQL 中 先连表 然后在 分组在统计作者个数
"""
"""
按表分组
"""
res = models.Book.objects.annotate(a_c=Count('authors__pk')).values('name', 'a_c')
print(res)
"""
按表中字段分组
"""
res = models.Book.objects.values('name').annotate(a_c=Count('authors__pk')).values('name', 'a_c')
print(res)
新加字段
F与Q查询
F查询
from django.db.models import F
# 1.查询库存大于卖出数的书籍
"""
当条件不是明确的 也需要从数据库中获取
需要使用F查询
"""
res = models.Book.objects.filter(kucun__gt=F('maichu')).values('name')
print(res)
# 2.将所有书的价格涨800
models.Book.objects.update(price=F('price')+800)
# 3.将所有书的名称后面追加新款
from django.db.models.functions import Concat
from django.db.models import Value
models.Book.objects.update(name=Concat(F('name'), Value('新款')))
res = models.Book.objects.all().values('name')
print(res)
Q查询
# 查询主键是 1 且价格大于2000的书籍
"""
当条件与条件之间的关系 不是and 的时候需要用Q
"""
from django.db.models import Q
res = models.Book.objects.filter(Q(pk=1), Q(price__gt=2000)).values('name') # and
print(res)
# 查询主键是 1 或者价格大于2000的书籍
res = models.Book.objects.filter(Q(pk=1) | Q(price__gt=2000)).values('name') # or
print(res)
# 查询主键不是1 或者价格大于2000的书籍
res = models.Book.objects.filter(~Q(pk=1) | Q(price__gt=2000)).values('name') # ~ 是 not
print(res)