繁体   English   中英

除了models.CASCADE 用于Django 模型中的ForeignKey 之外,还有其他on_delete 选项吗?

[英]Is there any other option for on_delete other than models.CASCADE for a ForeignKey in Django models?

为什么 Django model 中 ForeignKey 的on_delete属性不是默认值? 如果除models.CASCADE之外没有其他选项,则应该是这种情况。 on_delete属性还有其他选项吗?

是的, on_delete=…参数 [Django-doc]有多个内置处理程序。 该文档指定:

  • CASCADE级联删除。 Django 在ON DELETE CASCADE上模拟 SQL 约束的行为,并删除包含ForeignKey的 object 。 (……)

  • PROTECT :通过引发 django.db.IntegrityError 的子类ProtectedError来防止删除引用的django.db.IntegrityError

  • RESTRICT :通过引发RestrictedError ( django.db.IntegrityError 的子类)来防止删除引用的django.db.IntegrityError PROTECT不同,如果引用的 object 还引用了在同一操作中被删除但通过 CASCADE 关系的不同 object,则允许删除引用的 object。 (……)

  • SET_NULL :设置ForeignKey null 这只有在nullTrue时才有可能。

  • SET_DEFAULT :将ForeignKey设置为其默认值; 必须设置 ForeignKey 的default

  • SET(…) :将ForeignKey设置为传递给SET()的值,或者如果传入了可调用对象,则为调用它的结果。 (……)

  • DO_NOTHING :不采取任何行动。 如果您的数据库后端强制执行引用完整性,这将导致 IntegrityError,除非您手动将 SQL ON DELETE约束添加到数据库字段。

此外,您还可以为on_delete=…参数编写自己的处理程序。 例如,在本文中,我讨论了实现一个在某种程度上与SET(…)相同的处理程序,但它使用的可调用对象接受应更新的 object 作为参数。

在“早期”, 和之前,您不必设置on_delete=…参数: CASCADE被用作默认值。 但这使得在引用的 object 被删除的情况下应该发生的事情变得相当隐含,所以后来他们使参数成为强制性参数。

从这里的 djangos 文档中提取这些: https://docs.djangoproject.com/en/4.0/ref/models/fields/#foreignkey

他们也有代码示例。

on_delete 的可能值在 django.db.models 中找到:

CASCADE 级联删除。 Django 在 DELETE CASCADE 上模拟 SQL 约束的行为,并删除包含 ForeignKey 的 object。

Model.delete() 不会在相关模型上调用,但会为所有已删除的对象发送 pre_delete 和 post_delete 信号。

PROTECT 通过引发 django.db.IntegrityError 的子类 ProtectedError 来防止删除引用的 object。

RESTRICT 通过引发 RestrictedError(django.db.IntegrityError 的子类)来防止删除引用的 object。 与 PROTECT 不同,如果引用的 object 还引用了在同一操作中被删除的不同 object,则允许删除引用的 object,但通过 CASCADE 关系。

SET_DEFAULT 将 ForeignKey 设置为其默认值; 必须设置 ForeignKey 的默认值。

SET() 将 ForeignKey 设置为传递给 SET() 的值,或者如果传入了可调用对象,则为调用它的结果。 在大多数情况下,需要传递一个可调用对象以避免在导入 models.py 时执行查询:

DO_NOTHING 不采取任何行动。 如果您的数据库后端强制执行引用完整性,这将导致 IntegrityError,除非您手动将 SQL ON DELETE 约束添加到数据库字段。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM