聚合 分组以及F与Q查询

djangoday06

一、图书馆里系统讲解

1.表的设计
2.首页展示
3.书籍查询
3.书籍添加
3.书籍编辑
3.书籍删除

具体逻辑代码后面会挂在底部

二、聚合查询

聚合函数:Max Min Sun Count Avg
在ORM中支持单独使用聚合函数 用关键字:aggregate
    
from django.db.models import Max, Min, Sum, Avg, Count
res = models.Book.objects.aggregate(Max('price'), Min('price'), Sum('price'), Avg('price'), Count('pk'))
print(res)

三、分组查询

# 温馨提示来袭哟!
如果执行ORM分组查询报错 并且有关键字sql_mode strict mode 
移除sql_mode中的only_full_group_by 即可! 代码如下

set global sql_mode='stric_trans_tables';

1.统计每一本书的作者个数

res = models.Book.objects.annotate(author_num=Count('authors_pk')).values('title', 'author_num')
print(res)

2.统计出每个出版社卖出的最便宜的书的价格

res = models.Publish.objects.annotate(min_price=Min('book_price')).values('name', 'min_price')
print(res)

3.统计不止一个作者的书

# 1.先统计每本书作者个数
res = models.Book.objects.annotate(author_num=Count('author_pk'))
# 2.再从中筛选作者个数大于1的数据
res.filter(author_num_gt=1).values('title', 'author_num')

3.查询每个作者的书总价格

res = models.Author.objects.annotate(totalprice=Sum('book__price'),count_book=Count('book_pk')).values('name','totalprice','count_book')
print(res)
# 按照表名分组
models.表名.objects.annotate()
# 按照values括号内指定的字段分组
models.表名.objects.values('字段名').annotate()
res = models.Book.objects.values('publish_id').annotate(count_pk=Count('pk')).values('publish_id','count_pk')
print(res)

四、F与Q查询

1.什么是F查询?
F查询:同一张表格的不同字段之间的查询
当查询条件不是明确的 也需要从数据库中获取 就需要使用F查询
2.什么是Q查询?
Q查询:需要复杂的逻辑关系的时候使用Q查询
逗号默认是and,处理不了or not 这样的更复杂查询条件 这时Q查询用上排场了
| 表示取或or
& 表示取且and
~ 表示取反not

1.查询库存数量大于卖出的书籍数量

from django.db.models import F
res = models.Book.objects.filter(stock__gt=F('sold'))
print(res)

2.将所有书的价格涨800

from django.db.models import F
models.Book.objects.update(price=F(price) + 800)

3.将所有书的名称后面追加爆款

from django.db.models import F
from django.db.models.functions import Concat
from django.db.models import Value

models.Book.objects.update(title=Concat(F('title'),Value('爆款')))

4.查询主键是1或者大于2000的书籍

from django.db.models import Q
res = models.Book.objects.filter(Q(pk=1) | Q(price__gt=2000))
posted @ 2022-12-16 16:54  阿丽米热  阅读(31)  评论(0编辑  收藏  举报
Title