Django中删除存在多对多关联关系的表实体时会发生什么?
核心结论
Django 不允许直接给ManyToManyField设置on_delete参数,本质是因为多对多关联的删除规则是绑定在中间表的外键上的,默认遵循级联删除逻辑:
- 你举例的场景中,删除
Author表的Britney Britney记录时不会抛出异常,该作者和图书A的多对多关联记录会被同步自动移除,图书A剩下的关联作者仅保留Tom Lam、Lam Tom。
底层逻辑拆解
- 多对多关联的实现依赖独立的中间表,表中会存储两个分别指向关联模型(
Book和Author)的外键字段,on_delete参数实际是定义在这两个外键上的,而非外层的ManyToManyField。 - 如果使用Django自动生成的默认中间表,两个外键的
on_delete默认值为CASCADE,只要任意一端的关联实体被删除,中间表中对应的所有关联行都会被级联删除,不会残留无效关联记录。 - 如果是通过
through参数指定的自定义中间表,你可以自行修改外键的on_delete规则:- 若设置为
PROTECT:删除作者时如果存在关联的图书记录,会抛出ProtectedError异常,阻止删除操作 - 若设置为
SET_NULL:需要外键允许为空,删除作者后中间表对应的作者外键会被置为NULL,但这种场景在多对多关联中很少使用
- 若设置为
内容的提问来源于stack exchange,提问作者user12314098
相关产品推荐
相关产品推荐

