迹忆客 专注技术分享

当前位置:主页 > 学无止境 >

Django 模型中 On_delete 参数的作用

作者:迹忆客 最近更新:2023/02/27 浏览次数:

Django 模型简化了数据库和表的创建、向表中添加新数据或元组、删除、检索和修改。使用 Django 模型,我们可以借助外键轻松建立表之间的关系。

在设置关系时,我们必须为一些参数设置值。一个这样的参数是 on_deleteon_delete 参数用于配置删除引用对象时应采用的行为。它基本上用于定义如何处理删除引用对象的影响。

on_delete 参数可以配置为七种可能的行为或操作。我们将单独讨论所有这些。

在建立模型之间的关系时,通常会使用级联行为。当一个被引用的对象被删除时,所有引用该被引用对象的对象也将被删除。

语法:

XYZ = models.ForeignKey(WASD, on_delete = models.CASCADE)

为了更好地理解它,请考虑以下示例。请注意,同样的示例也将用于解释其他一些行为。

有一个网站,作者可以在网站上注册自己并写博客。现在代表两个实体,考虑两个模型,即 AuthorBlogBlog 中的所有条目或元组都有一个外键引用(或正在引用)到 Author 条目或元组。它代表了一种关系,即每篇博客都属于写它的作者。

现在,假设网站有一项政策,如果作者删除他/她的帐户,那么他或她曾经写过的所有博客都将被删除。在这种情况下,级联关系将是一个恰当的选择。

如果存在引用此对象的对象,则 PROTECT 参数可防止删除引用的对象。换句话说,只要引用它的对象存在,就不能删除被引用的对象。在删除引用对象之前,必须手动删除引用对象。通过引发 ProtectedError 阻止删除。

这种关系可以用在数据非常重要和敏感​​的地方,如果处理得当,你不能丢失它。或者当引用对象也在其他地方使用时,如果没有适当的验证和处理,它们就不能被删除。

RESTRICT 类似于 PROTECT。它还可以防止删除引用的对象并引发 RestrictedError。但两者之间有细微的差别。与 PROTECT 不同,如果被引用的对象正在引用某个其他对象是一个 CASCADE 关系,并且它也被删除,则允许删除。换句话说,如果引用对象和被引用对象在 CASCADE 关系中引用了某个其他公共对象,则允许删除引用对象。

考虑以下示例。

class Artist(models.Model):
    name = models.CharField(max_length = 100)

class Album(models.Model):
    artist = models.ForeignKey(Artist, on_delete = models.CASCADE)

class Song(models.Model):
    artist = models.ForeignKey(Artist, on_delete = models.CASCADE)
    album = models.ForeignKey(Album, on_delete = models.RESTRICT)

如果我们尝试删除 Album 对象,则会引发 RestrictedError。但是,如果我们尝试删除 Artist 对象,那么删除将成功,因为引用 Album 对象的歌曲也引用了 CASCADE relationship 中的 Album 对象引用的 Artist 对象。

SET_NULL 的情况下,顾名思义,当删除一个引用对象时,所有引用对象的引用对象都设置为 NULL。这种关系要求引用的对象字段可以为空。

XYZ = models.ForeignKey(WASD, on_delete = models.SET_NULL, null = True)

例如,如果网站有一个政策,如果作者离开,那么他/她的博客不会但被删除。相反,所有博客的作者将被设置为匿名作者或 None

SET_DEFAULT 的情况下,当引用对象被删除时,所有引用对象的引用对象都会设置为默认值。这个默认值可以是 NULL 以及其他一些 Django 模型或表。这种关系要求引用的对象字段在 NULL 的情况下可以为空。

XYZ = models.ForeignKey(WASD, on_delete = models.SET_DEFAULT, null = True, default = QWERTY)

例如,如果网站有一个政策,如果作者离开,那么他/她所有博客的作者将是管理员或公司本身。在这种情况下,SET_DEFAULT 将是正确的选择。

SET()SET_DEFAULT 完全相同。它也可以接受 Django 模型或表格。唯一的区别是在 SET() 中,我们可以传递一个可调用对象,如果引用的对象被删除,它将为所有引用对象调用。

XYZ = models.ForeignKey(WASD, on_delete = models.SET(...), null = True)

可调用函数和模型看起来像这样。

def getUser():
    """Callable function
    """
    return User.objects.get_or_create(username = "anonymous")[0]

class Author(models.Model):
    user = models.ForeignKey(User, on_delete = models.SET(getUser))

DO_NOTHING 是一种可能存在于两个模型之间的风险关系。顾名思义,当一个被引用对象被删除时,所有引用对象的被引用对象都不会被改变。换句话说,不会做任何事情来处理删除的影响。

这是一种非常危险的行为,因为它会导致完整性问题,因为引用的对象已被删除,但引用的对象仍在引用它。

XYZ = models.ForeignKey(WASD, on_delete = models.DO_NOTHING)

转载请发邮件至 1244347461@qq.com 进行申请,经作者同意之后,转载请以链接形式注明出处

本文地址:

相关文章

Python 中的第一类函数

发布时间:2023/04/25 浏览次数:113 分类:Python

第一类函数是被语言视为对象或变量的函数。 我们可以将它们分配给变量或将它们作为对象传递给其他函数。Python 支持第一类函数的功能。

Python 函数参数类型

发布时间:2023/04/25 浏览次数:140 分类:Python

在这篇 Python 文章中,我们将学习 Python 中使用的函数参数类型。 我们还将学习如何编写不带参数的 Python 函数。

Python 生成器中的 send 函数

发布时间:2023/04/25 浏览次数:111 分类:Python

本教程将介绍如何在 Python 中使用生成器的 send() 函数。我们可以创建一个像迭代器一样运行的函数,并且可以通过 Python 生成器函数在 for 循环中使用。

Python Functools 偏函数

发布时间:2023/04/25 浏览次数:80 分类:Python

本文介绍了我们如何使用分部函数,该函数随 functools 库一起提供,并附有示例。 这显示了调用时如何传递属性和部分函数。

Python main() 函数中的参数

发布时间:2023/04/25 浏览次数:157 分类:Python

在本教程结束时,我们应该了解Python 中在 main() 中使用参数是否是一种好的做法。

Python 中的内置 identity 函数

发布时间:2023/04/25 浏览次数:88 分类:Python

identity 函数只是一个返回其参数的函数。 当我们定义一个恒等函数并赋值时,它会返回该值。在本教程结束时,我们将了解 Python 是否具有内置的 identity 函数。

在 Python 中拟合阶跃函数

发布时间:2023/04/25 浏览次数:177 分类:Python

阶跃函数是带有看起来像一系列步骤的图形的方法。 它们由一系列中间有间隔的水平线段组成,也可以称为阶梯函数。本文给出了阶跃函数的简单演示。

在 Python 中创建双向链表

发布时间:2023/04/25 浏览次数:54 分类:Python

双向链表是指由称为节点的顺序链接的记录集组成的链接数据结构。 每个节点包含一个前一个指针、一个下一个指针和一个数据字段。

将 Python 类对象序列化为 JSON

发布时间:2023/04/25 浏览次数:152 分类:Python

本教程介绍序列化过程。 它还说明了我们如何使用 toJSON() 方法使 JSON 类可序列化,并包装 JSON 以转储到其类中。

扫一扫阅读全部技术教程

社交账号
  • https://www.github.com/onmpw
  • qq:1244347461

最新推荐

教程更新

热门标签

扫码一下
查看教程更方便