图书管理系统、聚合查询、分组查询、F与Q查询
-
图书管理系统讲解
-
聚合查询
-
分组查询
-
F与Q查询
图书管理系统讲解
1.表设计
先考虑普通字段再考虑外键字段
数据库迁移、测试数据录入
2.首页展示
3.书籍展示
4.书籍添加
5.书籍编辑
后端如何获取用户想要编辑的数据、前端如何展示出待编辑的数据
6.书籍删除
聚合查询
MySQL聚合函数:
"""
Max 统计最大值
Min 统计最小值
Sum 统计求和
Count 统计计数
Avg 统计平均值
"""
在ORM中支持单独使用聚合函数 使用关键字>>>:aggregate
操作方法:
from django.db.models import Max,Min,Sum,Avg,Count
res = models.Book.objects.aggregate(Max('price'))
# 查看价格最高、最低、价格之和、平均价格、书本个数
res = models.Book.objects.aggregate(书本个数=Count('pk'),
Maxprice=Max('price'),
最小价=Min('price'),
allPrice=Sum('price'),
平均价格=Avg('price')
)
print(res)
分组查询
'''MySQL分组操作: group by 关键字: annotate'''
ORM执行分组操作,报错的话就去修改sql_mode 移除only_full_group_by
from django.db.models import Max, Min, Sum, Avg, Count
# 统计每一本书的作者个数
res = models.Book.objects.annotate(author_num=Count('authors__pk')).values('title', 'author_num')
print(res)
# 统计出每个出版社卖的最便宜的书的价格
res = models.Publish.objects.annotate(min_price=Min('book__price')).values('name', 'min_price')
print(res)
# 统计不止一个作者的图书
# 1.先统计每本书的作者个数
res = models.Book.objects.annotate(author_num=Count('authors__pk')).values('author_num')
# 2.筛选出作者个数大于1的数据
res = models.Book.objects.annotate(author_num=Count('authors__pk')).filter(author_num__gt=1).values('title','author_num')
print(res)
# 查询每个作者出的书的总价格
res = models.Author.objects.annotate(总价=Sum('book__price'), count_book=Count('book__pk')).values('name', '总价','count_book')
print(res)
"""
models.表名.objects.annotate 按照表分组
models.表名.objects.values('字段名').annotate() 按照values括号内指定的字段分组
"""
# 查询每个出版社出版了几本书
res = models.Book.objects.values('publish_id').annotate(count_pk=Count('pk')).values('publish_id', 'count_pk')
print(res)
新增字段
F与Q查询
- F查询
'''当查询条件不是明确的 也需要从数据库中获取 就需要使用F查询'''
# 1.查询库存数大于卖出数的书籍
from django.db.models import F
res = models.Book.objects.filter(kucun__gt=F('maichu'))
print(res)
# 2.将所有书的价格涨1600
models.Book.objects.update(price=F('price') + 1600)
# 3.将所有书的名称后面追加爆款
from django.db.models.functions import Concat
from django.db.models import Value
models.Book.objects.update(title=Concat(F('title'), Value('新款')))
- Q查询
# 查询主键是1或者价格大于2000的书籍
res = models.Book.objects.filter(pk=1,price__gt=2000) # 逗号默认是and关系
这里要使用到或的关系,因为filter括号内为and关系,并且不能修改,所以使用Q
from django.db.models import Q
'''使用Q对象,我们就可以做逻辑运算符'''
res = models.Book.objects.filter(Q(pk=1), Q(price__gt=2000)) # 逗号是and
res = models.Book.objects.filter(Q(pk=1) | Q(price__gt=2000)) # |是or
res = models.Book.objects.filter(~Q(pk=1) | Q(price__gt=2000)) # ~是not
print(res.query)
Q查询进阶操作
'''
Q对象进阶用法
filter(price=100)
filter('price'=100)
当我们需要编写一个搜索功能 并且条件是由用户指定 这个时候左边的数据就是一个字符串
'''
from django.db.models import Q
o q_obj = Q() # 1.产生q对象
q_obj.connector = 'or' # 默认多个条件是and可以修改为or
q_obj.children.append(('pk', 1)) # 2.添加查询条件
q_obj.children.append(('price__gt', 2000)) # 支持添加多个
res = models.Book.objects.filter(q_obj) # 查询支持直接填写q对象
print(res)
分类:
django
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 周边上新:园子的第一款马克杯温暖上架
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器
· DeepSeek如何颠覆传统软件测试?测试工程师会被淘汰吗?
· 使用C#创建一个MCP客户端