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

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

为什么Django模型中外键的​​on_delete 属性不是默认值?如果除了 models.CASCADE 之外没有其他选择,应该是这种情况。 on_delete 属性 还有其他选择吗?

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

  • CASCADE Cascade deletes. Django emulates the behavior of the SQL constraint ON DELETE CASCADE and also deletes the object containing the ForeignKey. (…)

  • PROTECT: Prevent deletion of the referenced object by raising ProtectedError, a subclass of django.db.IntegrityError.

  • RESTRICT: Prevent deletion of the referenced object by raising RestrictedError (a subclass of django.db.IntegrityError). Unlike PROTECT, deletion of the referenced object is allowed if it also references a different object that is being deleted in the same operation, but via a CASCADE relationship. (…)

  • SET_NULL: Set the ForeignKey null; this is only possible if null is True.

  • SET_DEFAULT: Set the ForeignKey to its default value; a default for the ForeignKey must be set.

  • SET(…): Set the ForeignKey to the value passed to SET(), or if a callable is passed in, the result of calling it. (…)

  • DO_NOTHING: Take no action. If your database backend enforces referential integrity, this will cause an IntegrityError unless you manually add an SQL ON DELETE constraint to the database field.

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

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

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

他们也有代码示例。

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

级联 级联删除。 Django 模拟 SQL 约束的行为 ON DELETE CASCADE 并且还删除包含 ForeignKey 的对象。

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

保护 通过引发 django.db.IntegrityError.

的子类 ProtectedError 来防止删除引用的对象

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

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

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

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