Diango教程-Django on_delete参数
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
Post
现在,我们删除了《You can win》一书的作者。删除该作者后,相关帖子也会自动删除。现在,我们的数据库将如下所示。
Post
在下一个示例中,我们将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”,与该作者关联的帖子将设置为空。
我们已经展示了on_delete选项的两个示例。您可以创建自己的模型并应用每个选项并观察结果。
结论
在本文中,我们提到了如何在外键中使用on_delete参数。它提供了删除记录并控制删除对引用记录的影响的灵活性。它需要多个选项,每个选项都允许我们控制引用数据的行为。