第三篇: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 复制代码
缓存数据库:提前已经将你想要的数据准备好了 你来直接拿就可以,提高效率和响应时间。
案例:当你在修改你的数据的时候 你会发现数据并不是立刻修改完成的而是需要经过一段时间才会修改【博客园】
相关推荐
不剪发的Tony老师6 小时前
SQLite 3.51.0发布,新功能解读
数据库·sqlite
【D'accumulation】7 小时前
.NET Framework 4.8 + Microsoft.Data.Sqlite 报 Library e_sqlite3 not found
microsoft·sqlite·.net
周杰伦_Jay7 小时前
【Python后端API开发对比】FastAPI、主流框架Flask、Django REST Framework(DRF)及高性能框架Tornado
数据结构·人工智能·python·django·flask·fastapi·tornado
JELEE.11 小时前
Django登录注册完整代码(图片、邮箱验证、加密)
前端·javascript·后端·python·django·bootstrap·jquery
小灰灰搞电子20 小时前
Rust 操作Sqlite数据库详细教程
数据库·rust·sqlite
yumgpkpm21 小时前
Doris 并入CMP7(类Cloudera CDP 7.3.1 404华为鲲鹏ARM版)的方案和实施源代码
大数据·oracle·sqlite·sqoop·milvus·cloudera
黄色茶杯1 天前
AI编程工具TRAE解决日常问题之SQLite数据复制
数据库·sqlite
linuxxx1101 天前
django中request.GET.urlencode的使用
后端·python·django
星空的资源小屋1 天前
Text Grab,一款OCR 截图文字识别工具
python·django·ocr·scikit-learn
言之。2 天前
【Django】基础1(万字讲解)
django