(Django)MySQL外键级联首先删除父级或子级

时间:2017-03-11 06:58:27

标签: python mysql django

目前,我正在使用Django和MySQL后端数据库。

让我们拥有以下数据库架构

class Parent(models.Model):
     parent_id  = models.BigAutoField(primary_key=True)
     last_child = models.ForeignKey('Child', on_delete=models.PROTECT)

class Child(models.Model):
     child_id = models.BigAutoField(primary_key=True)
     parent   = models.ForeignKey('Parent', on_delete=models.CASCADE)

每个家长可以有多个孩子,但每个孩子只能有一个孩子。字段last_child指向父母出生的最后一个孩子。我试图通过这种模式表达的是

  • 只要父母还活着,最后一个孩子就不会死(被删除)

  • 所有儿童在父母去世后死亡

但是由于PROTECT vs CASCADE存在冲突,我对数据库完整性有一些顾虑。

我的问题是,如果我删除Parent,MySQL会先尝试删除什么?是先删除Parent然后尝试删除Child行,还是反过来?

1 个答案:

答案 0 :(得分:2)

删除对象时Django的作用 - >它首先删除所有子项,然后删除该对象。

您的架构有点奇怪,您需要制作last_child对象null-able,因为如何在没有parent的情况下创建children

如果没有child,您就无法创建parent,并且无法使用parent创建last_child

因此,当您last_child无效时,在parent.delete上需要设置last_child = null,然后拨打parent.delete()。我想你会好的。