Django on_delete17 Mar 2025 | 5 分钟阅读 Django 提供了许多优点和功能,更改数据库是其最好的好处之一。 Django 框架可以毫不费力地处理后端流程。 Django 模型可以轻松地执行创建、删除和更新等过程,非常灵活。在本教程中,我们将完整介绍 Django 的 on_delete 参数。 on_delete 是一个参数,有助于有效地执行与数据库相关的任务。当 Django 中建立关系时,会使用此参数。 on_delete 参数允许我们使用外键。 很明显,每当外键概念出现时,on_delete 参数都应该被声明为外键中的参数之一。 此参数决定是否必须进行删除。它告诉删除父值时该怎么办。此选项允许数据库导向操作具有很大的灵活性。 让我们了解以下语法。 Django on_delete 的语法
各种 on_delete 选项Django 以其强大的关系管理数据库管理系统而闻名。 on_delete 句柄用于处理引用数据的删除,以维护数据库的完整性。 on_delete 包括以下选项 -
CASCASE当我们把 on_delete 参数设置为 CASCADE 时,删除引用对象也会删除被引用对象。此选项在许多关系中最有用。假设一篇文章有评论;当 Post 被删除时,该 Post 上的所有评论都将自动删除。我们不希望在关联的 Post 被删除后,评论仍然保存在数据库中。 PROTECTPROTECT 选项的行为与 CASCDE 恰好相反;如果我们尝试删除实际的引用对象,则不会删除引用对象上的所有数据实例。简单来说,如果被引用的对象在数据库中有一个引用它的对象,则会阻止被引用对象被删除。如果一篇文章包含评论,则无法删除该文章。 如果我们强制删除引用对象,它将引发 ProtectedError,可以在视图中处理它。 SET_NULL首先,我们需要将外键上的空选项设置为 True;我们可以 在 on_delete 选项上使用 SET_NULL 选项。当我们删除引用的对象时,引用值将更新为 NULL。简单来说,文章在没有删除相关评论的情况下被删除,并设置为 NULL。 SET_DEFAULT此选项的工作方式与名称所暗示的相同;它采用定义关系时设置的默认值。当我们删除被引用对象时,引用对象值将被分配给我们创建的默认值。当我们删除有评论的 Post 时,评论会自动分配给我们创建模型的默认文章。 SET()它与 SET_DEFAULT 非常相似,但提供了更大的灵活性。当我们删除被引用对象时,引用值将更新为 NULL。因此,NULL 值将被引用对象替换。 DO_NOTHING顾名思义,当我们删除被引用对象时,它什么也不做。不建议使用它,因为它违反了 RDBMS 的目的。评论仍然引用不存在的已删除文章。这会导致很多错误和数据完整性错误。 RESTRICTRESTRICT 选项与 PROTECT 选项类似,但唯一的区别是当我们删除 on_delete 上的引用对象时,会引发 RestrictedError。 但是,如果引用对象和引用的对象分配了对不同公共对象的引用,则 RESTRICT 将提供删除引用对象的功能。 示例 -Models.py 文件 我们创建了两个模型:Author 和 Post。在 Post 模型中,我们定义一个名为 Author 的外键字段,该字段引用 Author 的对象。然后我们将 on_delete 参数定义为 CASCADE。 要在控制面板中显示模型,需要在 admin.py 文件中注册它。 admin.py 创建帖子和作者后,我们的数据库中包含以下数据。 作者 ![]() Post ![]() 现在,我们删除图书 "You can win" 的作者。删除此作者后,关联的帖子也会自动删除。现在,我们的数据库将如下所示。 Post ![]() 在下一个示例中,我们将 on_delete 的属性从 CASCADE 更改为 IS_NULL 并迁移数据库。让我们看看它对数据库的影响。 我们删除作者名称 "Mathew Barnard", 与该作者关联的帖子将设置为 null。 ![]() 我们已经展示了 on_delete 选项的两个示例。您可以创建自己的模型并应用每个选项并观察结果。要获取有关提到的 on_delete 选项的完整详细信息,请访问 Django 的官方文档。 结论在本文中,我们介绍了如何在外键中使用 on_delete 参数。它提供了删除记录的灵活性,并控制了删除对引用记录的影响。它有多个选项,每个选项都允许我们控制引用数据的行为。 下一个主题Django 基于类的通用视图 |
我们请求您订阅我们的新闻通讯以获取最新更新。