• 关于ORM框架多表增删改查


    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 拿到的就是这个作者对应的所有图书

    最后、希望大家看完有所收获,评论区欢迎留言交流!!!

  • 相关阅读:
    Python 数据可视化:Matplotlib库的使用
    vscode pandas无法使用
    【力客热题HOT100】-【057】169 多数元素
    垃圾回收的知识点
    竞赛 基于机器视觉的车道线检测
    Pandas-pd.to_numeric函数知识点总结
    深入 Django 的 URL 分发器
    echart双柱状图
    Java寻找两个正序数组的中位数
    蒙特卡洛树搜索(MCTS)怎么实现的?+ 上置信范围Upper Confidence Bounds(UCB)是什么?
  • 原文地址:https://blog.csdn.net/m0_58618019/article/details/126541009