聚合 分组以及F与Q查询

导读:本篇文章讲解 聚合 分组以及F与Q查询,希望对大家有帮助,欢迎收藏,转发!站点地址:www.bmabk.com

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))

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/69991.html

(0)
小半的头像小半

相关推荐

极客之音——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!