on_delete 对 Django 模型有什么作用?

2024-04-22

我对 Django 很熟悉,但我最近注意到存在一个on_delete=models.CASCADE与模型的选项。我已经搜索了相同的文档,但除了以下内容之外我找不到任何内容:

Django 1.9 中的更改:

on_delete现在可以用作第二个位置参数(以前它通常仅作为关键字参数传递)。它将成为 Django 2.0 中的必需参数。

使用示例是 https://docs.djangoproject.com/en/stable/ref/models/fields/#django.db.models.ForeignKey:

from django.db import models

class Car(models.Model):
    manufacturer = models.ForeignKey(
        'Manufacturer',
        on_delete=models.CASCADE,
    )
    # ...

class Manufacturer(models.Model):
    # ...
    pass

on_delete 的作用是什么? (我猜如果模型被删除,要执行的操作.)

什么是models.CASCADE do? (文档中的任何提示)

还有哪些其他可用选项(如果我的猜测是正确的)?

这方面的文档位于哪里?


这是当引用的对象被删除。它不是 Django 特有的;这是一个 SQL 标准。尽管 Django 在 SQL 之上有自己的实现。(1)

发生此类事件时,可以采取七种可能的操作:

  • CASCADE:当引用的对象被删除时,也删除引用它的对象(例如,当您删除博客文章时,您可能还想删除评论)。 SQL 等效项:CASCADE.
  • PROTECT:禁止删除引用的对象。要删除它,您必须手动删除引用它的所有对象。 SQL 等效项:RESTRICT.
  • RESTRICT: (Django 3.1中引入)类似的行为PROTECT匹配 SQL 的RESTRICT更精确地。 (看Django 文档示例 https://docs.djangoproject.com/en/stable/ref/models/fields/#django.db.models.RESTRICT)
  • SET_NULL:将引用设置为NULL(要求字段可为空)。例如,当您删除用户时,您可能希望保留他在博客文章上发布的评论,但说它是由匿名(或已删除)用户发布的。 SQL 等效项:SET NULL.
  • SET_DEFAULT:设置默认值。 SQL 等效项:SET DEFAULT.
  • SET(...):设置给定值。这不是 SQL 标准的一部分,完全由 Django 处理。
  • DO_NOTHING:可能是一个非常糟糕的主意,因为这会在数据库中产生完整性问题(引用实际上不存在的对象)。 SQL 等效项:NO ACTION. (2)

Source: Django 文档 https://docs.djangoproject.com/en/stable/ref/models/fields/#django.db.models.ForeignKey.on_delete

也可以看看PostgreSQL 的文档 https://www.postgresql.org/docs/current/static/sql-createtable.html例如。

在多数情况下,CASCADE是预期的行为,但对于每个外键,您应该始终问自己在这种情况下预期的行为是什么。PROTECT and SET_NULL通常很有用。环境CASCADE如果不应该,则可以通过简单地删除单个用户来级联删除所有数据库。


澄清级联方向的附加说明

有趣的是注意到CASCADE行动对于很多人来说并不清楚。事实上,注意到这一点很有趣only the CASCADE行动不明确。我知道级联行为可能会令人困惑,但是您必须认为它与任何其他动作的方向相同。因此,如果你觉得CASCADE你不清楚方向,它实际上意味着on_delete您不清楚行为。

在数据库中,外键基本上由整数字段表示,其值是外对象的主键。假设您有一个条目评论_A,它有一个条目的外键文章_B。如果删除该条目评论_A, 一切安好。文章_B曾经生活在没有评论_A如果它被删除了,也不必担心。但是,如果您删除文章_B, then 评论_A恐慌!它从来没有没有过文章_B并且需要它,它是其属性的一部分(article=article_B,但是什么是文章_B???)。这是哪里on_delete采取步骤,确定如何解决此问题完整性错误,或者说:

  • “不!求你了!不要!没有你我​​活不下去!”(据说PROTECT or RESTRICT在 Django/SQL 中)
  • “好吧,如果我不是你的,那么我就不是任何人的”(据说SET_NULL)
  • “再见世界,没有B条我就活不下去”并自杀(这是CASCADE行为)。
  • “没关系,我有闲人了,以后就参考文章_C了” (SET_DEFAULT, 甚至SET(...)).
  • “我无法面对现实,我会一直呼唤你的名字,哪怕这是我唯一的事情!” (DO_NOTHING)

我希望它能让级联方向更加清晰。 :)


脚注

(1)Django 在 SQL 之上有自己的实现。并作为@JoeMjr2 在下面的评论中提到 https://stackoverflow.com/questions/38388423/what-does-on-delete-do-on-django-models/38389488#comment107117244_38389488,Django不会创建SQL约束。如果您希望数据库确保这些约束(例如,如果您的数据库被其他应用程序使用,或者您不时挂在数据库控制台中),您可能需要自己手动设置相关约束。有一张不限票 https://code.djangoproject.com/ticket/21961在 Django 中添加对数据库级删除约束的支持。

(2)其实,有一种情况,DO_NOTHING可能有用:如果您想跳过 Django 的实现并在数据库级别自行实现约束。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

on_delete 对 Django 模型有什么作用? 的相关文章

随机推荐

  • 使用底图扭曲图像保持透明度

    我有一张 RGBA png 地图 所有海洋都是透明的 我想在北极立体投影中使用底图 并使用带有扭曲图像的地图 当我想保留透明度时 透明度会丢失并被黑色取代 我能做些什么 我的最终目标是在海洋中绘制颜色网格 然后在其上方绘制透明地图 from
  • 如何在 SwiftUI TextField 中将文本加粗?

    从 Xcode 11 2 1 开始 SwiftUI 中的文本字段没有内置的字体粗细修饰符 我们如何在不将 UITextField 扩展为 UIViewRepresentable 的情况下引入 font weight 使用与 SwiftUI
  • package-lock.json 中的 `"dev" true` 是做什么用的?

    什么是 dev true意味着在package lock json file 就我而言 当我执行时它会自动更新npm运营 我们怎样才能去除它呢 所以回答你的第一个问题 dev true in package lock json意味着这个依赖
  • Qt、QML 和 Windows 8 [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我一直对Qt框架引入的QML很好奇 但从未有机会使用它 但现在随着 Windows 8 的到来 基于旧式小部件的界面将变得过时 只是我
  • Tkinter:在主循环中调用事件

    如何调用 tkinterevent来自一个单独的对象 我正在寻找类似 wxWidgets 的东西wx CallAfter 例如 如果我创建一个对象 并将我的对象传递给它Tkroot 实例 然后尝试从我的对象调用该根窗口的方法 我的应用程序锁
  • Rest API 和 Restful Web 服务之间的区别

    我是网络服务新手 有人可以帮助我理解 REST API 和 java 中的 Restful Web 服务之间的区别吗 我开发了一个仅基于 servlet 和 jsp 的 Web 应用程序 现在必须使用 REST API 开发相同的应用程序
  • 使用Prepared Statement,如何返回插入行的id?

    我想检索数据库中插入行的 ID 但我不知道该怎么做 我尝试使用 SQL 子句返回RETURNING id 但不起作用 插入行后如何返回id 拨打电话后execute 准备语句上的方法 插入行的 id 将在insert id属性 pstm g
  • 通过管道从子shell获取退出代码

    我怎样才能获得退出代码wget来自子shell进程 所以 主要问题是 等于0 哪里可以 8成立 gt OUT wget q http budueba com net tee a file txt echo 0 它的工作原理无需tee 实际上
  • 编译错误:无法打开模块文件

    我有这个代码 PROGRAM xfit driver for routine fit USE nrtype USE nrutil USE nr USE ran state ONLY ran seed IMPLICIT NONE INTEGE
  • Android AlarmManager 与 Handler 的不同情况

    有人可以通过示例向我解释使用 AlarmManager 与 Handler 的不同情况吗 使用这两者交替使用有什么缺点吗 Thanks 他们彼此之间没有什么关系 我假设你指的是使用类似的东西postDelayed on Handler用于轮
  • 如何从Python中列表的字典中的值生成所有组合

    我想生成在字典中索引的列表中的所有值组合 A D E B F G H C I J 每次 每个字典条目的一项都会被选择并与其他键中的项目组合 所以我有 D F I D F J D G I D G J D H I E H J 我知道有一些东西可
  • Unity静态工厂扩展

    我似乎无法在任何地方找到 Microsoft Practices Unity StaticFactory dll 还有其他注册静态工厂的方法吗 寻找类似的东西 容器 RegisterFactory gt FooFactory CreateF
  • 使用箭头键导航 Material-ui 列表

    我正在使用material ui 来制作电子应用程序 有些屏幕是主从结构 我使用列表来显示概述 我希望能够使用箭头键浏览此列表 有内置选项可以执行此操作吗 如果它不是内置的 那么最好的方法是什么 Update 我现在制作了自己的组件 不确定
  • ASP.NET Core 2 - 使用 IISExpress 使用自定义域名和 ssl 进行开发

    我希望能够使用自定义域和 ssl 而不是本地主机进行本地开发 如何在 VS 解决方案中设置自定义域 ssl 而不是 localhost 简单设置 使用服务器 URL 如果您想关联您的服务器以使用分配给服务器 网络主机的所有 IP 地址 那么
  • 如何修复 boto3 中不存在用户池 ********

    我是新来的AWS https aws amazon com and boto 3 https boto3 amazonaws com v1 documentation api latest index htmlPython SDK 我配置了
  • Dapper 与 SQLite 和 C# 错误“为命令提供的参数不足”

    自原始帖子以来的新信息 这段代码成功检索了一个实体 这让我认为 QueryMultiple 映射与 Query 不同 真的吗 using var multi sqlConn QueryMultiple sqlStmt new Mytable
  • 当与curl一起使用--negotiate时,是否需要keytab文件?

    The 文档 http hadoop apache org docs stable hadoop project dist hadoop hdfs WebHDFS html描述如何连接到 kerberos 安全端点显示以下内容 curl i
  • 'CALL "C:\Program Files\nodejs\\node_modules \npm\bin\npm-cli.js" 前缀 -g' 不被识别为内部或外部命令,

    C Users MNE GO DIGITAL gt npm CALL C Program Files nodejs node exe C Program Files nodejs node modules npm bin npm cli j
  • 需要类型名错误(模板相关错误)

    我在另一个模板化的类中有一个名为 node 的类 Node 类的一些方法返回 Node 指针 这是我如何实施的摘录 template
  • on_delete 对 Django 模型有什么作用?

    我对 Django 很熟悉 但我最近注意到存在一个on delete models CASCADE与模型的选项 我已经搜索了相同的文档 但除了以下内容之外我找不到任何内容 Django 1 9 中的更改 on delete现在可以用作第二个