对于 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(…)
相同的处理程序,但它使用的可调用接受应更新的对象作为参数。
在“早期”、django-1.8 和之前,您不必设置 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 约束添加到数据库字段。
为什么Django模型中外键的on_delete
属性不是默认值?如果除了 models.CASCADE
之外没有其他选择,应该是这种情况。 on_delete
属性 还有其他选择吗?
是的,on_delete=…
parameter [Django-doc] 有多个内置处理程序。文档指定:
CASCADE
Cascade deletes. Django emulates the behavior of the SQL constraintON DELETE CASCADE
and also deletes the object containing theForeignKey
. (…)
PROTECT
: Prevent deletion of the referenced object by raisingProtectedError
, a subclass ofdjango.db.IntegrityError
.
RESTRICT
: Prevent deletion of the referenced object by raisingRestrictedError
(a subclass ofdjango.db.IntegrityError
). UnlikePROTECT
, 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 theForeignKey
null
; this is only possible ifnull
isTrue
.
SET_DEFAULT
: Set theForeignKey
to its default value; adefault
for the ForeignKey must be set.
SET(…)
: Set theForeignKey
to the value passed toSET()
, 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 SQLON DELETE
constraint to the database field.
此外,您还可以为 on_delete=…
参数编写自己的处理程序。例如,在 this article 中,我讨论了实现一个在某种程度上与 SET(…)
相同的处理程序,但它使用的可调用接受应更新的对象作为参数。
在“早期”、django-1.8 和之前,您不必设置 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 约束添加到数据库字段。