我很熟悉Django,但最近注意到有一个带有模型的on_delete=models.CASCADE
选项,我已经搜索了相同的文档,但是找不到任何东西:
在Django 1.9中更改:on_delete
现在可以用作第二个位置参数(以前它通常只作为关键字参数传递)。它将是Django 2.0中的必需参数。
an example case of usage is
from django.db import models
class Car(models.Model):
manufacturer = models.ForeignKey(
'Manufacturer',
on_delete=models.CASCADE,
)
# ...
class Manufacturer(models.Model):
# ...
pass
在删除时做什么?(如果模型被删除,我想应该执行的操作)
models.CASCADE
做什么?(文档中的任何提示)还有其他的选择吗(如果我的猜测是正确的话)?
文件存放在哪里?
最佳答案
这是删除被引用对象时要采用的行为。它不是django特有的,这是一个SQL标准。
发生此类事件时,有6种可能的操作:CASCADE
:删除被引用对象时,还应删除对其具有引用的对象(例如,删除博客文章时,可能还需要删除注释)。SQL等价物:CASCADE
。PROTECT
:禁止删除引用的对象。要删除它,您必须删除所有手动引用它的对象。SQL等价物:RESTRICT
。SET_NULL
:将引用设置为空(要求该字段为空)。例如,当您删除一个用户时,您可能希望保留他在博客文章中发表的评论,但假设它是由匿名(或已删除)用户发表的。SQL等价物:SET NULL
。SET_DEFAULT
:设置默认值。SQL等价物:SET DEFAULT
。SET(...)
:设置给定值。这个不是SQL标准的一部分,完全由Django处理。DO_NOTHING
:这可能是一个非常糟糕的想法,因为这会在数据库中创建完整性问题(引用一个实际上不存在的对象)。SQL等价物:NO ACTION
。
来源:Django documentation
例如,也可参见the documentation of PostGreSQL。
在大多数情况下,CASCADE
是预期的行为,但是对于每个外键,您应该总是问自己在这种情况下预期的行为是什么。PROTECT
和SET_NULL
通常很有用。设置CASCADE
在不应该设置的地方,只需删除一个用户,就有可能级联删除所有数据库。
澄清级联方向的附加说明
有趣的是,许多人并不清楚CASCADE
动作的方向。实际上,有趣的是注意到只有CASCADE
操作不清楚。我知道级联行为可能会让人困惑,但是您必须认为它与任何其他操作的方向相同。因此,如果你觉得CASCADE
方向对你来说不清楚,那实际上意味着on_delete
行为对你来说并不清楚。
在数据库中,外键基本上由整数字段表示,该字段的值是外键对象的主键。假设你有一个条目注释A,它有一个条目文章的外键。如果你删除了条目注释A,一切都很好,文章B过去一直没有注释A,如果它被删除了就不麻烦了。但是,如果你删除了文章,那么评论就会惊慌失措!它从来没有没有过没有物品的生活,它需要物品,这是它属性的一部分(article=article_B
,但什么是物品???)。这是on_delete
要确定如何解决此完整性错误的步骤,请执行以下操作:
“不!拜托!不要!没有你我活不下去!”(在SQL语言中称为PROTECT
)
“好吧,如果我不是你的,那我就不是别人的”(也就是说SET_NULL
)
“再见,我不能没有文章”和自杀(这是CASCADE
行为)。
“没关系,我有多余的爱人,我会从现在开始参考文章C”(SET_DEFAULT
,甚至SET(...)
)。
“我不能面对现实,我会一直喊你的名字,即使这是我唯一的选择!”(DO_NOTHING
)
我希望它能使级联方向更清晰。:)
关于python - on_delete对Django模型有什么作用?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/47914325/