第三篇:Django创建表关系及生命周期流程图

第三篇:Django创建表关系及生命周期流程图

文章目录

一、Django中orm创建表关系

一、数据库中的表关系

我们可以通过换位思考来理解数据表之间的关系,表关系如下所示。

python 复制代码
"""
表与表之间的关系
	一对多
	多对多
	一对一
	没有关系
判断表关系的方法:换位思考
"""

我们先简单建立几张表,然后判断各个表之间的关系。

分别为图书表、作者表、出版社表、作者详情表【未画出】。我们逐个分析个表之间的关系,我们发现。

python 复制代码
图书和出版社是一对多的关系 外键字段建在多的那一方 book
图书和作者是多对多的关系 需要创建第三张表来专门存储
作者与作者详情表是一对一

二、创建表

创建表关系,先将基表创建出来,然后再添加外键字段,且不用考虑先创建被关联表。

  1. 图书表

    python 复制代码
    class Book(models.Model):
        # 书名
        title = models.CharField(max_length=32)
        # 价格:总共八位 小数点后面占两位
        price = models.DecimalField(max_digits=8,decimal_places=2)
        # 外键:【一对多】图书和出版社是一对多 并且书是多的一方 所以外键字段放在书表里面
        publish = models.ForeignKey(to='Publish')  # 默认就是与出版社表的主键字段做外键关联
        # 外键:【多对多】图书和作者是多对多的关系 外键字段建在任意一方均可 但是推荐你建在查询频率较高的一方
        authors = models.ManyToManyField(to='Author')
        """
        注意:authors是一个虚拟字段 主要是用来告诉orm 书籍表和作者表是多对多关系,让orm自动帮你创建第三张关系表。
        """

    注意:

    python 复制代码
    """
    1、如果字段对应的是ForeignKey那么会orm会自动在字段的后面加_id
    2、如果你自作聪明的加了_id那么orm还是会在后面继续加_id
    """
    所以,后面在定义ForeignKey的时候就不要自己加_id
  2. 出版社表

    python 复制代码
    class Publish(models.Model):
        name = models.CharField(max_length=32)
        addr = models.CharField(max_length=32)
  3. 作者表

    python 复制代码
    class Author(models.Model):
        name = models.CharField(max_length=32)
        age = models.IntegerField()
        # 外键:【一对一】作者与作者详情是一对一的关系 外键字段建在任意一方都可以 但是推荐你建在查询频率较高的表中
        detail = models.OneToOneField(to='AuthorDetail')
        """
        OneToOneField也会自动给字段加_id后缀,所以你也不要自作聪明的自己加_id
        """
  4. 作者详情表

    python 复制代码
    class AuthorDetail(models.Model):
        # 注意BigIntegerField
        phone = models.BigIntegerField()  # 或者直接字符类型
        addr = models.CharField(max_length=32)
  5. 创建效果如下

我们进一步分析,打开app01_book,我们发现自动创建了主键字段id,同时给关联外键的字段publish自动添加了后缀,变成了publish_id。【此关系为多对一】

打开app01_author,我们发现给detail添加了后缀,变成了detail_id。【此关系为一对一】

打开app01_book_author,我们发现也自动添加了后缀。【此关系为多对多】

总结:

python 复制代码
"""orm中如何定义三种关系?"""

# 默认就是与出版社表的主键字段做外键关联
publish = models.ForeignKey(to='Publish')  
# 默认就是id之间建立外键关系
authors = models.ManyToManyField(to='Author') 
# 默认就是id之间建立外键关系
detail = models.OneToOneField(to='AuthorDetail')

"""ForeignKey、OneToOneField、ManyToManyField会自动在字段后面加_id后缀"""

补充:

python 复制代码
# 在django1.X版本中外键默认都是级联更新删除的
# 多对多的表关系可以有好几种创建方式 这里仅为其中一种
# 针对外键字段里面的其他参数 暂时不要考虑

二、Django请求生命周期流程图

补充:

python 复制代码
缓存数据库:提前已经将你想要的数据准备好了 你来直接拿就可以,提高效率和响应时间。
案例:当你在修改你的数据的时候 你会发现数据并不是立刻修改完成的而是需要经过一段时间才会修改【博客园】
相关推荐
兵慌码乱8 天前
面向桌面端的资产管理系统分层架构设计与核心模块实现
python·系统架构·sqlite·pyqt5·数据库设计·桌面应用开发·mvc架构
呱呱复呱呱8 天前
Django CBV 源码解读:一个请求是怎么找到你的 get() 方法的
python·django
兵慌码乱9 天前
基于Python+PyQt5+SQLite的药房管理系统实现:事务一致性与界面解耦全流程解析
python·sqlite·信号与槽·pyqt5·数据库设计·桌面应用开发·事务处理
伶俜6614 天前
鸿蒙原生应用实战(十八)ArkUI 记账本:SQLite 账单 + 图表统计 + 分类管理
jvm·sqlite·harmonyos
码云骑士14 天前
31-慢查询排查全流程(上)-Django-Debug-Toolbar与EXPLAIN入门
后端·python·django
龙腾AI白云14 天前
数字孪生和世界模型,二者的技术边界正在慢慢融合吗?
人工智能·django·知识图谱
伶俜6614 天前
鸿蒙原生应用实战(二十)ArkUI 课程表 App:Grid 网格 + SQLite 存储 + 周次切换 + 上课提醒
华为·sqlite·harmonyos
码云骑士14 天前
30-在线图书管理系统-Django从零搭建到上线部署完整实战
后端·python·django
2601_9618752415 天前
花生十三资源盘|电子版|全科
python·django·flask·virtualenv·scikit-learn·pygame·tornado
码云骑士15 天前
28-Docker部署Django(下)-docker-compose编排与静态文件处理
docker·容器·django