Oh,大家好我是Cute,我回来更新我的Blog了!!!
今天分享一下Django框架中ORM数据库的操作和关于多表的增删改查,用图书管理系统为例。
首先在app里的models.py里创建几个类:
这里说一下ORM(翻译过来就是:对象关系映射)
到底Django是怎么映射Mysql(这样一种存储结构化数据的关系型数据库)
一共主要有三种映射关系:
类,在Django中申明这样一个类也叫模型类 它对应的就是数据库的一张table表;
类变量,在Django中的类里相当于就是一个静态变量 它对应数据库的字段、变量;
对象,通过类创建对象 实例化出这样一个模型类对象 它对应的数据库的一条数据,也叫记录;
想必大家应该能大致明白吧!
我的理解:相当于就是将Python类对象的语法最后转换为sql语句
回忆一下基本的sql语句:
创建数据库:create database 数据库名 chaset="utf8mb4"; 字符集设置 尽量能够多存储一些数据
!创建表:创建表之前需要选择使用哪一张表 use 数据库名;
创建table表的语句: create table [if not exists] 表名( 表达的意思:如果不存在这张表就创建
字段一 类型 约束...,
字段二 类型 约束...,
...
);
简单的增删改查(单表):
查询: select 字段1,字段2... from table表名 条件
逻辑条件包括:条件筛选 where 排序 order by 分组查询[ group by having ]
注意:where在分组之前执行判断 不能使用聚合函数 having是在分组后可以过滤数据 可以使用聚合函数 默认分组就是这张表的所有记录(一条数据 一行数据)
分组没有多么高深:就是将相同的字段对应的值分在一起,再分别进行查询 例如:查询每个班级学生的平均成绩
思路:先通过班级id分组 然后直接使用聚合函数即可。
聚合函数包括:avg() sum() max() min() count() 查询大该就这么多东西. 欢迎大佬评论区补充!!!
增加数据:insert into 表名(字段1,字段2...) values(值1,值2...);
更新数据:update 表名 set 字段=值...(可指定条件更新数据);
删除数据: delete from 表名 where条件;
table表的类型和约束:
类型:int flocat double char varchar(这个需要指定最大长度 更好节省内存 但是效率就没有char快 )
date[年-月-日] datetime text 存储文本 .......
约束:非空 主键(自动就是非空唯一 、一般Table表里都需要一个主键字段 提高查询效率)
By the way:如果创建表的时候没有创建主键 默认使用的Innodb引擎自动就会给你创建一个_id字段,方便查询。 自增auto_increment 一般是主键设置的约束 针对浮点数 最大长度 保留小数点位数
外键 多表关联。
多表的关系:
一对一:例如:作者和作者详情 不情愿把所有的作者信息全部弄在一个表里,展示不方便;可以在任意一方设设置一个外键 做到关联数据的效果。
一对多:例如:一个出版社可以出版多本图书 一本图书一般不能被多个出版社出版
只需在多的一方设置一个外键 关联记录即可。
多对多:例如:一个作者可以写多本图书、一本图书可以被多个作者写 数据库里建立第三方表字段对应即可。例如:查询一个作者写了那些书??? 先通过作者名查询主键对应的值 再通过第三方表查询对应的图书编号 进而查询到图书的一些信息:图书名 图书价格 图书发布时间 子查询。
Django通过ORM建立设置表:
作者表:作者名 作者年龄
作者详情表:作者性别 作者女朋友 等等
图书表:图书名 图书价格 图书发布时间
出版社表:出版社名称 出版社地址 等等
Django里setting.py文件里设计的一些配置信息: 打印sql语句、数据库建立连接配置


设置Mysql驱动:

回到app里的models.py文件里创建模型类进而创建Table表:

作者和作者详情表关联: 一对一

小插曲: 不知道看到了什么就是想提一嘴 哈哈!

多表中常用的参数:

图书和作者: 多对多

图书和出版社: 多对一

执行命令及其注意事项:

ORM创建结果展示:
作者表:

作者详情表:

图书表:

出版社表:

图书和作者 多对多关系的第三方表:

逆向到模型展示:
不要将约束都弄一个类里,不然你想不容易看出关系 为外键约束 navacat是这样的。

多表增删改查:
简单的单表添加 出版社表


也可以先实例化一个模型类对象再保存 .save() 不然是没有这个效果的 create 直接就可以保存!
作者表也是一样的增方式。
作者表和作者详情表:


可以传入模型类对象自动将主键id值弄进去;也可以直接传id 都是建立记录关联。
这就是一对一的增加、下面我们看一下一对多的增加 注意:多对多不需要传值!!! 就是一张表

简直和一对一的增加方式一模一样 要么传入模型类对象、要么传入_id=

多对多 增加 本质也是模型类对象和主键id值

基本操作:


最后总结一下:关于多表查询
一对一:任意一方设置即可OneToOne 默认unique属性 级联删除
一对多:在多的一方设置外键 级联删除
多对多:任意一方设置 ManyToMany 级联删除
添加记录:我这里分别举一个案例
一对一:作者和作者详情 假设约束设置在作者这张表里
第一种:可以先查到一个作者详情对象 再塞入作者进去查询
a1=AutherDetails.objects.get(pk=1或者其他属性)
rs=Author.objects.create(字段,,,AutherDetails=a1) 自动将主键传进去
第二种:直接传 AutherDetails_id
Author.objects.create(字段,,,AutherDetails_id=1)
一对多: 出版社 图书 图书这边设置约束
可以先拿到出版社对象 传进去 也可以通过直接传
Book.objects.create(...Publish_id=1)
多对多:图书和作者
可以先拿到几个作者对象 再通过Book.第三张表.add()传入即可
也可以直接 Book.第三张表.add(可以写多个作者表对应的主键id值)
反向查询 通过设置 related_name 字段来帮助查询:
这里就举两个例子了: 思路 先拿到一个再使用关键字段即可!!!
第一个:通过出版社查询图书 在Book和出版社里设置 related_name=xx
这里考虑数量关系 出版社对应多本图书
先拿到一个出版社 .xx 拿到的就是这个出版社对应的所有图书
第二个:通过作者查询到所有的图书 在Book和作者里设置 related_name=xx
先拿到一个作者.xx 拿到的就是这个作者对应的所有图书
最后、希望大家看完有所收获,评论区欢迎留言交流!!!