• 多表断连


    一。基表。

      通常,当有一些属性所有的表都会用到时,可以创建一个基表用来被其他表继承,其中有一个abstract = True,代表这个表不会再数据库中生成对应的表:

    class BaseModel(models.Model):
    is_delete = models.BooleanField(default=False)
    create_time = models.DateTimeField(auto_now_add=True)

    # 设置 abstract = True 来声明基表,作为基表的Model不能在数据库中形成对应的表
    class Meta:
        abstract = True
    

    复制代码
    二。断关联多表关系。

      在表的设计中,如果出现环形的关联设计,这些表就永远不会被删除,所以可以通过逻辑上的关联实现表关联,而表中的关联不存在。

    publish = models.ForeignKey(
        to='Publish',
        related_name='books',
        db_constraint=False,
        on_delete=models.DO_NOTHING,
    )
    

      设计表时,relate_name代表的就是查询该字段时的名字。

      db_constraint表示这个外键是否有关联。

      on_delete就是代表关联的表在被删除后的动作。

      表设计:

    """
    Book表:name、price、img、authors、publish、is_delete、create_time

    Publish表:name、address、is_delete、create_time

    Author表:name、age、is_delete、create_time

    AuthorDetail表:mobile, author、is_delete、create_time

    BaseModel基表
    is_delete、create_time
    上面四表继承基表,可以继承两个字段
    .
    1、外键位置:
    一对多 - 外键放多的一方
    一对一 - 从逻辑正反向考虑,如作者表与作者详情表,
        作者删除级联删除详情,详情删除作者依旧存在,所以建议外键在详情表中
    多对多 - 外键在关系表中

    2、ORM正向方向连表查找:
    正向:通过外键字段 eg: author_detial_obj.author
    反向:通过related_name的值 eg:author_obj.detail
    注:依赖代码见下方

    3、连表操作关系:
    1)作者删除,详情级联 - on_delete=models.CASCADE
    2)作者删除,详情置空 - null=True, on_delete=models.SET_NULL
    3)作者删除,详情重置 - default=0, on_delete=models.SET_DEFAULT
    4)作者删除,详情不动 - on_delete=models.DO_NOTHING
    注:拿作者与作者详情表举例

    4、外键关联字段的参数 - 如何实现 断关联、目前表间操作关系、方向查询字段
    i)作者详情表中的
    author = models.OneToOneField(
    to='Author',
    related_name='detail',
    db_constraint=False,
    on_delete=models.CASCADE
    )

    ii)图书表中的
    publish = models.ForeignKey(
        to='Publish',
        related_name='books',
        db_constraint=False,
        on_delete=models.DO_NOTHING,
    )
    authors = models.ManyToManyField(
        to='Author'
        related_name='books',
        db_constraint=False,
    )
    注:ManyToManyField不能设置on_delete,
    

      OneToOneField、ForeignKey必须设置on_delete
      (django1.x系统默认级联,但是django2.x必须手动明确)
    """

  • 相关阅读:
    2018面试题
    输入对象和数量制造批量假数据
    前端监控和前端埋点方案设计--摘抄
    给页面上所有的a标签增加随机数每次点击保证最新
    给所有ajax请求增加随机数
    打印2018年的日历
    为图片添加文字 canvas
    地图搜索地图定位标注
    地图拖拽定位
    智能搜索地图
  • 原文地址:https://www.cnblogs.com/whnbky/p/12570314.html
Copyright © 2020-2023  润新知