[英]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
; 这只有在null
为True
时才有可能。
SET_DEFAULT
:将ForeignKey
设置为其默认值; 必须设置 ForeignKey 的default
。
SET(…)
:将ForeignKey
设置为传递给SET()
的值,或者如果传入了可调用对象,则为调用它的结果。 (……)
DO_NOTHING
:不采取任何行动。 如果您的数据库后端强制执行引用完整性,这将导致 IntegrityError,除非您手动将 SQLON DELETE
约束添加到数据库字段。
此外,您还可以为on_delete=…
参数编写自己的处理程序。 例如,在本文中,我讨论了实现一个在某种程度上与SET(…)
相同的处理程序,但它使用的可调用对象接受应更新的 object 作为参数。
在“早期”, django-1.8和之前,您不必设置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.