Django on_delete函数

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中创建外键时,必须使用此函数。接下来,它需要一些参数,我们将在另一个教程中讨论,其中之一就是 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选项的行为与 CASCADE 相反;如果我们尝试删除实际引用对象,则不会删除引用对象上的所有数据实例。简单来说,它会阻止在数据库中具有引用的对象被删除。如果一个帖子包含评论,它将无法被删除。

如果我们强制删除引用对象,它将引发 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将提供删除被引用对象的功能。

示例

Models.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)

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

作者

Django on_delete函数

发布帖子

Django on_delete函数

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

帖子

Django on_delete函数

在下一个示例中,我们将 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)

将下面的英文翻译成中文,不解释,保留HTML格式:

我们删除了作者名称 “Mathew Barnard”, 与此作者相关联的帖子将被设置为空。

Django on_delete函数

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

结论

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

Camera课程

Python教程

Java教程

Web教程

数据库教程

图形图像教程

办公软件教程

Linux教程

计算机教程

大数据教程

开发工具教程