巨蟒python全栈开发django9:一些知识点的汇总
回顾上周内容:
题目:
1.人民出版社出版过的所有书籍的名字以及作者的姓名(三种写法,笔记中有两种写法)
2.手机以2开头的作者出版过的所有书籍名称以及出版社名称(三种写法,笔记中有1种写法)
1.聚合查询(aggregate)
需求:查找所有书里边的最大价格的那本书
因为,书这张表中没有价格字段.我们需要添加一个这样的字段
同步数据库需要的指令,首先,找到,简化的指令
运行指令:
上边说明,需要设置一个默认值,所以,我们选择2,退出,在models.py里边添加默认值
这样就回到了,相关的界面
设置默认值为10
执行指令:
这时候,表里边就有一个,默认值为10的价格属性字段了
修改价格
查询价格最高的那本书
写完命令,点击查询
聚合就是上边最后得到的结果
首先,引入聚合函数
注意:这里报错的原因是max需要大写Max
运行,得到如下结果:
现在我们再起别名
,将别名进行了修改为,m_p
得到如下结果:
查一下书籍的总数
得到的是4条数据
利用filter和all进行筛选
如上图,以publish_id分组即可
得到如上结果:
出版社的名字是可以拿到的
连接字段
分组通过publish的名字
起别名:
2.分组查询
得到结果:
得到结果:
以and关系进行分组
结果:
分组之后,再统计结果
注意下面的book__id,指的是两个横杠
通过下面,我们知道尔康出了两本书
执行,得到结果:
先联表再进行分组
ORM执行原生sql语句
直接拿取数据
通过原生 的SQL,我们就得到了这样的结果
3.F&&Q查询
添加两个属性,点赞数和评论数
执行,两条命令:
makemigrations
migrate
得到如下表
添加数据得到如下所示:
F&&Q
注意,两个字段之间不能直接比较
集合为空,说明没有大于的
可以对F进行处理
更新,自增12
更新之后,
刷新之后,评论结果加上12
结果里边没有两个都大于1000的数据
Q通过管道符|实现"或者"的意思
且的话,我们再写在后边
注意一点:Q包裹的放在没有Q包裹的前面
4.自定义标签过滤器
自定义过滤器
运行:
下面是自定义标签:
如何运用到模板语言之中呢?(自定义过滤器)
需要处理的数据,函数,需要替换的参数,在下面的过滤函数中最多接收2个参数,而且这个过滤器和其他过滤器一样,
可以放到if判断,for循环等语句里面来使用
运行报错,之后的修改:
再次,运行,得到结果
得到的结果如上图
涉及到的文件夹(urls.py test.html views.py templatetags/mytag.py)
过滤器也可以如下图,这样使用
下面是自定义标签:(下面的函数,可以传递任意个参数)
运行,测试,得到结果:
注意,这个函数,不可以写在渲染语句里边
inclusion_tag标签
文件:(result.html mytag.py views.py test.html result.html urls.py )
return里边的data就是上边的html里边的data,前端接收后端的
以组件形式引入上边的标签的方式
在mytag.py里边的return里边的data通过以字典的形式,传递给result.html,进行渲染
运行:得到的结果
5.静态文件配置
一开始引入的是网络地址,bootstrap,如何添加到本地???
需要手动处理,为了防止bootstrap网上的崩溃了,需要写在本地
运行,得到结果:
现在,我们应用bootstrap样式,在jingtai.html文件里边
运行,得到结果:
万一哪一天,网上的bootstrap崩了,就需要有事情了,我们需要在本地处理
首先,在整个项目上创建jingtaiwenjian文件
将下载到本地的bootstrap,解压之后放到jingtaiwenjian里边
配置settings.py文件
运行:bootstrap并不起作用,这个和刚才的配置文件有关系
正确的写法
修改成的static,再次运行,就可以成功修改了.以别名的方式引入
如果别名修改成xxx,
引入的路径,也需要改成xxx
下面介绍一种,不需要改的,自动加载的方式:
将别名改成"666"试一下
如上图,依然可以得到上边的结果
我们将上边的结果,修改成statics,这是习惯性问题.
下面的settings.py也需要进行修改
在我们上边修改文件夹名字的时候,已经进行自动把这里的jingtaiwenjian修改成了statics
但是这里,羞不修改貌似,没有太大影响,已经测试过了.
6.事务和锁
锁:(遇到之后可以再读一下超哥的笔记)
锁,指的是,某些数据,在同一时间只能一个人用,尤其指的是数据库中的相关操作,
防止多人同时操作一条数据.
MYISAM支持的表级锁(锁住整个表),MYISAM又分为读锁和写锁是隔离的
INNODB支持的是行级锁(锁住一行)和表级锁
INNODB在更新和删除某条记录的时候是锁住的,其他人是不能查看的和写入
有很多概念.
更新和删除的时候,用的是表级锁
查询的时候是共享锁
事务的四大特性:原子性,持久性,唯一性,隔离性
上边的代码一直报错:
原因如下图:
运行:anyway.py,得到结果(报错)
我们再看一下,多了一条数据
运行成功,运行anyway.py出错的原因是因为属性不对应和publish表.
复习:
连表,分组,找数据(三步走)
#按照部门分组查询名字和id的数量 # select name,count(id) from emp group by dep; # ret = models.Emp.objects.value('dep').annotate(c=Count('id')) # print(ret) #查询每一个部门以及对应的员工数 # select dep.name,count(emp.id) from dep inner join emp on dep.id=emp.dep_id # group by dep.name,dep.id; # models.Dep.objects.values('id','name').annotate(c=Count('emp__id')) #查询每一个部门以及对应的员工数以及ID # select dep.id,dep.name,count(emp.id) as c from dep inner join emp on dep.id=emp.dep_id # group by dep.id,dep.name; # # models.Dep.objects.annotate(c=Count('emp__id')).values('name','c') # # select dep.name,count(emp.id) as c from dep inner join emp on dep.id=emp.dep_id group by dep.id;
mark_safe补充
在test.html里边调用
运行结果:
没有变成,修改如下标签
这样就修改成功了