python - on_delete对Django模型有什么作用?

标签 python django django-models

我很熟悉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是预期的行为,但是对于每个外键,您应该总是问自己在这种情况下预期的行为是什么。PROTECTSET_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/

相关文章:

forms - django-rest-framework - 在可浏览的 API 中自动生成表单?

django - 如何在没有重复字段的情况下注释字段django

python - 如何计算 PyTorch 张量的第二维中 1's and 0' 的数量?

python - 使用 Chaquopy 安装 TensorFlow 时出现 "Read timed out"

python - 为什么 Django fcgi 会死掉?我怎样才能知道?

python - Django 共享库/类

django - 从 1.11 迁移到 Django 2.2——外键中没有 on_delete 的旧迁移破坏了一切

python - &一起 bool 数据帧列表

python - 从大列表中按规则删除重复项

django - 为django设计模型结构