多表断连

一。基表。

  通常,当有一些属性所有的表都会用到时,可以创建一个基表用来被其他表继承,其中有一个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必须手动明确)
"""

posted @ 2020-03-25 21:03  年少无为腿毛怪  阅读(173)  评论(0编辑  收藏  举报