图书管理系统、聚合函数、分组查询、F与Q查询
图书管理系统
在针对数据路迁移失败时的问题, 一个数据库是只对应一个Django项目的,不要出现多个Django项目使用一个数据库 这样极其容易出现报错的得
1.表设计
首先要考虑普通字段崽考虑外键字段的数据库迁移、测试数据录入
当中自己先要确定一张最重要的表 书籍表
其他表数据:出版社表 作者表 作者详情表 还有多对多关系的由ORM自动创建的虚拟表
再对数据对数据录入时首先录入的得是出版社表和作者详情表,因为要考虑其他外键相关联 其他表先入的话没有数据来源无法录入的
2.首页搭建、展示
先路由层

再视图层中编写个home_func视图函数是要返回一个html页面的 再模型层中定义html文件homePage.html

g)
再确认主页面如何布局

要展示所有的图书信息

先要获取到所有的图书数据

要返回一个HTML页面 而且都是展示给用户看的信息 使用table表格标签
使用模板继承 在母板中圈出划定子板可修改的区域 block

母模板中至少应该标明三个区域:
页面内容、CSS样式区、JS代码区

继承页booklistPage在content编写的html会把母板写的替换掉
展示从1开始的有序数列 模板语法中的for循环 有一个特殊的关键 forloop(如果直接是主键展示的话将不会是有序的因为对有做修改的话将不是有序的)

这里要注意哦,时间是结构化时间无法展示,所以得对时间格式化。以及作者的展示,书跟作者是多对多的关系,一本书可能对应多个作者拿到的是,列表套多个对象

用标签的过滤器内置方法date对结构化时间做格式化处理

对作者for循环

在渲染中添加条件展示 模板语法for循环中关键字forloop

再添加编辑与删除按钮
书籍的添加
返回一个让用户可以输入书籍的相关数据的HTML页面

继承页bookAddPage在content编写的html会把母板写的替换掉
需要出版社和作者的全部数据

展示系统中的已有的出版社信息供选择和展示系统中已有的出版社信息供选择

再把用户选择的数据返回给后端

重定向redirect 在针对没有动态匹配的路由可以直接写

书籍编辑
首先要考虑在后端如何获取用户想要编辑的数据、前端如何展示出待编辑的数据?
用转换器路由匹配的方式

)
那么这时要注意在编写视图函数的时候传参

注意在添加作者以及出版社的时候要有默认值
根据编辑的书籍对象查询对应的出版社 与系统所有的出版社比对 如果有相同则添加默认选中的属性selected

作者默认选中

再传回到后端来

效果展示:

书籍删除
先编写删除接口

视图层视图函数

再对删除做一个二次确认 用到点击事件

聚合函数
聚合函数:
Max
Min
Sum
Count
Avg
在ORM中支持单独使用聚合函数 可以单独使用 关键字aggregate 需要导模块
from django.db.models import Max, Min, Sum, Count, Avg
res = models.Book.objects.aggregate(Max('price'), Count('pk'), 最小价格=Min('price'), allPrice=Sum('price'),平均价格=Avg('price'))
print(res)

分组查询
关键字annotate
如果在执行orm中出现有报错 并且有关键字sql_mode strict mode sql
移除sql_mode中的only_full_group_by
严格模式中将only_full_group_by模式移除
show variable like '%mode%';

按照表分组
models.表名.objects.annotate() 按照表分组
题目:统计每一本书的作者个数
分析:每一本数的作者个数肯定是按书来分组,从书籍表出发到作者表,外键是在书籍手里,所以是正向查询按外键字段
res = models.Book.objects.annotate(author_num=Count('authors__pk')).values('title', 'author_num')
print(res)
# models后面点的什么 annotate就按照什么进行分组

题目:统计出每一个出版社卖的最便宜的书的价格
分析:每一个出版社肯定是按出版社来分组,从出版社表出发到书籍表,外键是在书籍手里,所以是反向查询按表名小写
res = models.Publish.objects.annotate(min_price=Min('book__price')).values('name', 'min_price')
print(res)

题目:统计不止一个作者的图书
分析:作者的图书不为1的 那么先要知道每一本书的作者个数 然后再筛选出大于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)

按照字段分组
按照values括号内指定的字段分组
models.表名.objects.values('字段名').annotate()
按出版社id分组

res = models.Book.objects.values('publish_id').annotate(count_pk=Count('pk')).values('publish_id', 'count_pk')
print(res)

F与Q查询
给表中添加两个字段 库存数与卖出总数
在当你的表中有数据你再给表中添加数据的时候 是会给提示的 原来表中是有数据的 添加了新的字段就不知道要给新添加的字段写什么数据

1是让你添加默认值 2是让你退出去 改模型层
给新添加的字段添加默认值

F查询
一般都是提供具体的数值

当查询条件不是明确的 要查询字段来自于其他字段 也需要从数据库中获取 就需要使用F查询
1.查询库存数大于卖出数的书籍
from django.db.models import F
res = models.Book.objects.filter(kucun__gt=F('maichu'))
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(title=Concat(F('title'), Value('新款')))


Q查询
查询主键是1或者价格大于2000的书籍
将条件用Q包起来
逗号默认是and
查询主键是1和价格大于2000的书籍
res = models.Book.objects.filter(pk=1, price__gt=2000)
逗号默认是and关系

|是or
查询主键是1或者价格大于2000的书籍
from django.db.models import Q
res = models.Book.objects.filter(Q(pk=1) | Q(price__gt=2000)) # |是or
~是not
查询主键不是1或者价格大于2000的书籍
res = models.Book.objects.filter(~Q(pk=1) | Q(price__gt=2000)) # ~是not
print(res.query)

图书管理系统、聚合函数、分组查询、F与Q查询的更多相关文章
- Django 08 Django模型基础3(关系表的数据操作、表关联对象的访问、多表查询、聚合、分组、F、Q查询)
Django 08 Django模型基础3(关系表的数据操作.表关联对象的访问.多表查询.聚合.分组.F.Q查询) 一.关系表的数据操作 #为了能方便学习,我们进入项目的idle中去执行我们的操作,通 ...
- Django 聚合查询 分组查询 F与Q查询
一.聚合查询 需要导入模块:from django.db.models import Max, Min, Sum, Count, Avg 关键语法:aggregate(聚合结果别名 = 聚合函数(参数 ...
- Django模型系统——ORM中跨表、聚合、分组、F、Q
核心知识点: 1.明白表之间的关系 2.根据关联字段确定正反向,选择一种方式 在Django的ORM种,查询既可以通过查询的方向分为正向查询和反向查询,也可以通过不同的对象分为对象查询和Queryse ...
- Django orm进阶查询(聚合、分组、F查询、Q查询)、常见字段、查询优化及事务操作
Django orm进阶查询(聚合.分组.F查询.Q查询).常见字段.查询优化及事务操作 聚合查询 记住用到关键字aggregate然后还有几个常用的聚合函数就好了 from django.db.mo ...
- Django 聚合分组F与Q查询及choices
一.聚合查询 需要导入模块:from django.db.models import Max, Min, Sum, Count, Avg 关键语法:aggregate(聚合结果别名 = 聚合函数(参数 ...
- django----聚合查询 分组 F与Q查询 字段 及其 参数
目录 一.orm补充查询 聚合查询 1-1 分组查询 1-2 F与Q查询 1-3 二. 字段及其参数 常用字段 AutoField IntegerField CharField DateField D ...
- Django中多表的增删改查操作及聚合查询、F、Q查询
一.创建表 创建四个表:书籍,出版社,作者,作者详细信息 四个表之间关系:书籍和作者多对多,作者和作者详细信息一对一,出版社和书籍一对多 创建一对一的关系:OneToOne("要绑定关系的表 ...
- (day54)六、事务、分组、F、Q、常用字段、事务
目录 一.聚合查询aggregate 二.分组查询annotate 三.F与Q查询 (一)F查询 1. 查询库存数大于卖出数的书籍 2. 将所有书的价格上涨100块 3.将所有书的名称后面全部加上 & ...
- django基础之day05,F与Q查询,Q查询的高级用法
#F与Q查询 #*************************** F 查询 ******************** # F 查询数据库中的其他字段!!! #1.查询库存数大于卖出数的书籍 fr ...
- django F与Q查询 事务 only与defer
F与Q 查询 class Product(models.Model): name = models.CharField(max_length=32) #都是类实例化出来的对象 price = mode ...
随机推荐
- 复现CVE-2022-10270(向日葵远程代码执行漏洞)
警告 请勿使用本文提到的内容违反法律.本文不提供任何担保. 漏洞描述 向日葵是一款免费的,集远程控制电脑手机.远程桌面连接.远程开机.远程管理.支持内网穿透的一体化远程控制管理工具软件.CNVD披露了 ...
- .Net 7内容汇总(3)--反射优化
反射这玩意,一直以来都是慢的代名词.一说XXX系统大量的反射,好多人第一印象就是会慢. 但是呢,我们又不得不使用反射来做一些事情,毕竟这玩意可以说啥都能干了对吧. It's immensely pow ...
- 编码中的Adapter,不仅是一种设计模式,更是一种架构理念与解决方案
大家好,又见面了. 不知道下面这玩意大家有没有见过或者使用过?这是一个插座转换器.我们都知道日常使用的是220v的交流电,而国外不同国家使用的电流电压是不一样的(比如日本使用的是110v).且插座的接 ...
- H5调用微信支付
这里用的是 vue项目; 首先在mounted中判断是否有openId,如果没有,则去获取 let openid = localStorage.getItem('openid'); if (!open ...
- 我操作MySQL的惊险一幕
背景 前几天因工作需要,组长给我安排了一个数据清洗的任务. 任务:把 A 表的数据洗到 B 表. 我的第一反应,什么是「洗」?洗数据是什么?洗钱我倒是知道. 不过我不能慌啊,于是问了问组长. 我:组长 ...
- DateSet的应用
一.知识描述 1.什么是DataSet? DataSet为一个数据集,可以看做是一个内存中的数据库,包括表.数据行.数据列以及表与表之间的关系. 创建一个DataSet后,它可以单独存在,不需要一直保 ...
- 垃圾回收机制GC
垃圾回收机制GC 我们已经知道,name = 'leethon'这一赋值变量的操作,是将变量与数据值相绑定. 而数据值是存储到内存中的,有时变量会重新赋值即绑定其他数据值,而使得原本的数据值无法通过变 ...
- P6189 [NOI Online #1 入门组] 跑步 (DP/根号分治)
(才了解到根号分治这样的妙方法......) 将每个数当成一种物品,最终要凑成n,这就是一个完全背包问题,复杂度O(n2),可以得80分(在考场上貌似足够了......) 1 #include < ...
- 2021 CCPC 威海站 VP记录(题解)
2021 CCPC 威海站 VP记录(题解) 题目顺序为vp时开题顺序: A - Goodbye, Ziyin! 签到,连边数小于等于2的可以作为二叉树根,若有大于4的直接输出0. code: voi ...
- html点击a标签弹窗QQ聊天界面
以为很难.以为要第三方.谁知道不用.一句话的事情. 1 <a hfer="tencent://message/?uin=12345&Site=&Menu-=yes&qu ...