Django on_delete

17 Mar 2025 | 5 分钟阅读

Django 提供了许多优点和功能,更改数据库是其最好的好处之一。 Django 框架可以毫不费力地处理后端流程。 Django 模型可以轻松地执行创建、删除和更新等过程,非常灵活。在本教程中,我们将完整介绍 Django 的 on_delete 参数。

on_delete 是一个参数,有助于有效地执行与数据库相关的任务。当 Django 中建立关系时,会使用此参数。 on_delete 参数允许我们使用外键。

很明显,每当外键概念出现时,on_delete 参数都应该被声明为外键中的参数之一。

此参数决定是否必须进行删除。它告诉删除父值时该怎么办。此选项允许数据库导向操作具有很大的灵活性。

让我们了解以下语法。

Django on_delete 的语法

  • 最左边的值表示将在引用中创建的字段。我们需要提及将用于执行特定操作的特定字段。该字段将从父字段中提取数据,并且需要在此处提及父字段。它将通过框架进一步引用。在数据库中,field_name 将充当继承外键值的字段。
  • 在右侧,ForeignKey() 函数表示外键创建的操作。要在 Django 中创建外键,必须使用此函数。接下来,它需要几个参数,我们将在另一个教程中讨论,而 on_delete 是其中之一。
  • 第一个参数 WASD 表示希望继承的外键。然后,使用 on_delete 参数,该参数执行各种操作。

各种 on_delete 选项

Django 以其强大的关系管理数据库管理系统而闻名。 on_delete 句柄用于处理引用数据的删除,以维护数据库的完整性。

on_delete 包括以下选项 -

  • CASCADE
  • PROTECT
  • SET_NULL
  • SET_DEFAULT
  • SET()
  • DO_NOTHING

CASCASE

当我们把 on_delete 参数设置为 CASCADE 时,删除引用对象也会删除被引用对象。此选项在许多关系中最有用。假设一篇文章有评论;当 Post 被删除时,该 Post 上的所有评论都将自动删除。我们不希望在关联的 Post 被删除后,评论仍然保存在数据库中。

PROTECT

PROTECT 选项的行为与 CASCDE 恰好相反;如果我们尝试删除实际的引用对象,则不会删除引用对象上的所有数据实例。简单来说,如果被引用的对象在数据库中有一个引用它的对象,则会阻止被引用对象被删除。如果一篇文章包含评论,则无法删除该文章。

如果我们强制删除引用对象,它将引发 ProtectedError,可以在视图中处理它。

SET_NULL

首先,我们需要将外键上的空选项设置为 True;我们可以 在 on_delete 选项上使用 SET_NULL 选项。当我们删除引用的对象时,引用值将更新为 NULL。简单来说,文章在没有删除相关评论的情况下被删除,并设置为 NULL。

SET_DEFAULT

此选项的工作方式与名称所暗示的相同;它采用定义关系时设置的默认值。当我们删除被引用对象时,引用对象值将被分配给我们创建的默认值。当我们删除有评论的 Post 时,评论会自动分配给我们创建模型的默认文章。

SET()

它与 SET_DEFAULT 非常相似,但提供了更大的灵活性。当我们删除被引用对象时,引用值将更新为 NULL。因此,NULL 值将被引用对象替换。

DO_NOTHING

顾名思义,当我们删除被引用对象时,它什么也不做。不建议使用它,因为它违反了 RDBMS 的目的。评论仍然引用不存在的已删除文章。这会导致很多错误和数据完整性错误。

RESTRICT

RESTRICT 选项与 PROTECT 选项类似,但唯一的区别是当我们删除 on_delete 上的引用对象时,会引发 RestrictedError。 但是,如果引用对象和引用的对象分配了对不同公共对象的引用,则 RESTRICT 将提供删除引用对象的功能。

示例 -

Models.py 文件

我们创建了两个模型:Author 和 Post。在 Post 模型中,我们定义一个名为 Author 的外键字段,该字段引用 Author 的对象。然后我们将 on_delete 参数定义为 CASCADE。

要在控制面板中显示模型,需要在 admin.py 文件中注册它。

admin.py

创建帖子和作者后,我们的数据库中包含以下数据。

作者

Django on_delete

Post

Django on_delete

现在,我们删除图书 "You can win" 的作者。删除此作者后,关联的帖子也会自动删除。现在,我们的数据库将如下所示。

Post

Django on_delete

在下一个示例中,我们将 on_delete 的属性从 CASCADE 更改为 IS_NULL 并迁移数据库。让我们看看它对数据库的影响。

我们删除作者名称 "Mathew Barnard", 与该作者关联的帖子将设置为 null。

Django on_delete

我们已经展示了 on_delete 选项的两个示例。您可以创建自己的模型并应用每个选项并观察结果。要获取有关提到的 on_delete 选项的完整详细信息,请访问 Django 的官方文档。

结论

在本文中,我们介绍了如何在外键中使用 on_delete 参数。它提供了删除记录的灵活性,并控制了删除对引用记录的影响。它有多个选项,每个选项都允许我们控制引用数据的行为。