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

on_delete 是有助于高效执行数据库相关任务的参数之一。在 Django 中建立关系时使用此参数。on_delete 参数允许我们使用外键。

显然,每当出现外键概念时,都希望将on_delete参数声明为外键中的参数之一。

该参数决定是否必须进行删除。它告诉删除父值时要做什么。该选项为面向数据库的操作提供了一定程度的灵活性。

让我们理解以下语法。

Django on_delete 的语法

field name = models.ForeignKey(WASD, on_delete = OPERATION TYPE) 
  • 最左边的值表示将在引用中创建的字段。我们需要提及将用于执行特定操作的特定字段。该字段会从父字段中拉取数据,这里需要提及父字段。它将通过框架进一步引用。在数据库中,field_name将充当继承外键值的字段。
  • 右侧,ForeignKey()函数代表外键创建的操作。要在Django中创建foreign,这个函数是必须使用的。接下来,它需要几个参数,我们将在另一个教程中讨论,on_delete就是其中之一。
  • 第一个参数 WASD 表示预期继承的外键。然后,使用on_delete参数来执行各种操作。

各种删除选项

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

on_delete 包括以下选项 -

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

CASCADE

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

PROTECT

PROTECT 选项的行为与CASCDE 正好相反;如果我们尝试删除实际的引用对象,则引用对象上的所有数据实例都不会被删除。简而言之,如果数据库中有对象引用,它可以防止被引用的对象被删除。如果帖子包含评论,则无法删除。

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

SET_NULL

首先,我们需要将外键上的null选项设置为True;我们可以在 on_delete 选项上使用 SET_NULL 选项。当我们删除引用的对象时,引用值将更新为NULL。简单来说,删除帖子但不删除相关评论并设置为 NULL。

SET_DEFAULT

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

SET()

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

DO_NOTHING

顾名思义,当我们删除引用的对象时,它不会执行任何操作。不建议使用,因为它违反了 RDBMS 的目的。评论仍然涉及甚至不存在的已删除帖子。它会导致很多错误和数据完整性错误。

RESTRICT

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

例子

Modle.py 文件

from django.db import models  
  
# Create your models here.  
  
class Auther(models.Model):  
    first_name = models.CharField(max_length=30)  
    last_name = models.CharField(max_length=30)  
    email = models.EmailField()  
  
    def __str__(self):  
        return "%s %s" % (self.first_name, self.last_name)  
  
class Post(models.Model):  
    title = models.CharField(max_length=100)  
    # Here we define the on_delete as CASCADE  
    author = models.ForeignKey(Auther, on_delete=models.CASCADE)  
  
    def __str__(self):  
        return self.title  

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

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

admin.py

from django.contrib import admin  
  
from .models import Post, Author  
# Register your models here.  
admin.site.register(Post)  
admin.site.register(Author)  

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

Author

1.png

Post

2.png

现在,我们删除了《You can win》一书的作者。删除该作者后,相关帖子也会自动删除。现在,我们的数据库将如下所示。

Post

3.png

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

# Here we define the on_delete as IS_NULL  
author = models.ForeignKey(Author, on_delete=models.SET_NULL, null = True)  

我们删除作者姓名“Mathew Barnard”,与该作者关联的帖子将设置为空。

4.png

我们已经展示了on_delete选项的两个示例。您可以创建自己的模型并应用每个选项并观察结果。

结论

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

标签: django语言, django教程, django技术, django学习, django学习教程, django下载, django开发, django入门教程, django进阶教程, django高级教程, django面试题, django笔试题, django编程思想