“Day64 Django ORM 操作数据库 进阶用法 学习笔记”
今日内容概要(重要)
模型层(ORM语法):跟数据库打交道的
- 单表查询(增删改查)
- 常见的十几种查询方法
- 神奇的双下划线查询
- 多表操作
- 外键字段的增删改查
- 跨表查询(重点)
- 聚合查询
- 分组查询
- F与Q查询
一、环境准备
准备实验环境
1.1 基础准备
1、创建数据库day64
2、创建Django项目
3、设置setting.py
,连接Mysql的参数
4、设置__init__.py
文件,导入pymysql
5、创建app01应用,并在settings.py
中注册应用
6、编辑app01
中的models.py
,创建ORM模型
7、执行创建表操作
1.2 测试脚本
🌟 当你只是想测试django中的某一个py文件内容,那么你可以不用书写前后端交互的形式而是直接写一个测试脚本即可,脚本代码无论是写在应用下的tests.py还是自己单独开设py文件都可以
编辑test.py
文件
二、单表操作
单表的ORM操作
PS: 案例中的代码都是写在test.py
中执行
2.1 增删改查
2.1.1 增
增有两种方式
查看结果:
2.1.2 删
删除也有两种方式,通过主键删除数据
为什么用pk
?
2.1.3 改
原表信息
ORM修改数据表的三种方法:
PS: get
和filter
的区别
get方法:
返回的直接就是当前数据对象
一旦数据不存在该方法会直接报错
而filter则不会
所以我们还是用filter
查看结果
2.1.4 查
输出:
2.2 必知必会13条
2.2.1 查询所有数据
all()
方法:
2.2.2带有过滤条件的查询
filter()
方法
输出:
2.2.2.1 双下划线查询
2.2.3 直接拿数据对象
get()
方法
使用此方法,当条件不存在时,将直接报错
2.2.4 拿第一个/最后一个元素
新增一条数据
first()
方法拿第一个元素
last()
方法拿最有一个元素
2.2.5 获取指定的数据字段
values()
获取name和age字段,列表套字典
values_list()
获取name和age字段,列表套元组
2.2.6 去重
当前数据如下:
没有去重之前查询
使用distinct()
去重
2.2.7 排序
order_by()
排序(升)
order_by()
排序(降)
2.2.9 反转
reverse()
反转的前提是数据已经排序过
2.2.10 统计当前数据的个数
count()
统计个数
2.2.10 排除数据
exclude()
将name=’张三’的数据排除在外
输出
2.2.10 查询数据是否存在
exists()
查询数据是否存在
2.3 查看内部sql语句的方式
2.3.1 方式一
queryset对象能够点击query查看内部的sql语句
2.3.2 方式二
所有的sql语句都能查看,在settings.py
中添加
尝试查询数据的输出
三、多表操作
3.1 前期准备
编辑models.py
创建ORM对象
同步到数据库
查看数据库,确定创建成功
3.2 一对多外键增删改
3.2.1 增
准备出版社数据,案例:一个Publish对应多本Book
增之前先修改setting.py
取消外键检测
增数据的两种方式
查询数据库,已写入成功
3.2.2 删
删除主键为1
的出版社
查询,因为是级联更新,级联删除
,删除出版社后,对应的书也删除了
3.2.3 改
修改数据的两种方式
查询数据库,修改成功
3.3 多对多外键增删改查
多对多的案例:一本书有多个作者
添加作者,和作者描述
3.3.1 增
给书籍增加作者,两种方式
查询数据,关联成功,虚拟表更新
3.3.2 删
删除的两种方法
查询
3.3.3 改
查询
3.3.4 清空
3.4 正反向的概念
四、多表(跨表)查询
4.1 对象查询(子查询)
在书写orm语句的时候跟写sql语句一样的
不要企图一次性将orm语句写完 如果比较复杂 就写一点看一点
正向什么时候需要加.all()
当你的结果可能有多个的时候就需要加.all()
如果是一个则直接拿到数据对象
book_obj.publish
book_obj.authors.all()
author_obj.author_detail
案例一:查询书籍主键为9的出版社
案例二:查询书籍主键为7的作者
案例三:查询作者”张三”的电话
案例四、查询出版社是“没头脑出版社“的书
案例五、查询作者‘李四’写过的书
案例六:查询手机号是’234567’的作者姓名
4.2 双下划线查询(联表查询)
案例一:查询作者’张三’的手机号和年龄
案例二:查询书籍主键为9的出版社名称和书的名称
案例三:查询书籍主键为7的作者姓名
案例四:查询书籍主键市7的作者的手机号
五、周末作业