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 模型有什么作用? 的相关文章

  • 如何在包含 Django 模板标记的文件上运行 JSHint?

    我想在所有 Javascript 源文件上运行 JSHint 但其中一些源文件具有一些嵌入式 Django 模板标记 JSHint 在此标记上引发大量错误 有没有办法可以 告诉 JSHint 忽略此标记 使用一些虚拟数据运行 Django
  • 创建django权限,报错:ContentType匹配查询不存在

    我正在尝试添加两个组并授予他们对我的 Django 项目的权限 但我不断收到错误 ContentType 匹配查询不存在 我在跑步 姜戈 1 5 4 Python 2 7 3 南0 8 2 后SQL 9 3 这是我的代码 import dj
  • Django HTTPS 和 HTTP 会话

    我使用 Django 1 1 1 和 ssl 重定向中间件 通过 HTTPS 创建的会话数据 身份验证等 在站点的 HTTP 部分中不可用 无需将整个站点设置为 HTTPS 即可使其可用的最佳方法是什么 这是设计使然 您无法轻易更改 当通过
  • Django + nginx + uwsgi 无法登录

    我有非常简单的登录逻辑 类似于官方 Django 解决方案 class Login FormView template name login html form class AuthenticationForm def get self a
  • 无法创建超级用户 Django

    我假设这是因为我的超级用户依赖于还没有现有数据的 UserProfile 我的模型看起来像 from django db import models from django contrib auth models import User f
  • Django 中从 sqlite 迁移到 postgresql

    我想迁移自sqlite to PostgreSQL db 我安装了 postgresql 并在其 shell 上创建数据库 然后配置我的 django 设置如下 default ENGINE django db backends postg
  • 如何将 max_length 添加到 allauth 用户名

    我使用 Django allauth 作为我的 Django 站点的用户帐户框架 文档显示有一个ACCOUNT USERNAME MIN LENGTH http django allauth readthedocs io en latest
  • Django 模板标签内字符串连接最佳实践

    我正在尝试连接一些字符串以格式化模板标记内的 URL 但我找不到一种优雅的方法 到目前为止 我所拥有的是 button Activate http site domain url registration activate activati
  • 如何使用 javascript/jquery/AJAX 调用 Django REST API?

    我想使用 Javascript jQuery AJAX 在前端调用 Django Rest API 请求方法是 POST 但当我看到 API 调用它的调用 OPTIONS 方法时 所以 我开始了解access control allow o
  • Django Rest Framework 删除 csrf

    我知道有关于 Django Rest Framework 的答案 但我找不到解决我的问题的方法 我有一个具有身份验证和一些功能的应用程序 我向其中添加了一个新应用程序 它使用 Django Rest Framework 我只想在这个应用程序
  • 将 python 字典中的数据呈现给 django 模板。

    我有一本字典 data sok 1 10 sao 1 10 sok sao 2 20 我如何 循环字典 将我的数据作为 HTML 表呈现给 Django 模板 这种格式为表格 author qty Amount sok 1 10 sao 1
  • 如何在 Django 中使我的模型字段可选?

    我正在尝试遵循底部的完整示例 https docs djangoproject com en dev topics auth customizing https docs djangoproject com en dev topics au
  • 测试使用 South 迁移的 Django 应用程序

    我正在尝试为使用 South 迁移的 Django 应用程序创建一些功能测试 最终 我还将创建斜纹测试 当我尝试运行现有测试时 由于南方迁移出现问题 测试数据库未成功创建 58 次迁移中的第 7 次失败 看起来 为了测试的目的 最好从 Dj
  • 如何在 Django QuerySet 中将 DateField() + TimeField() 转换为本地时间?

    我的模型为这些字段 date models DateField 开始时间 models TimeField 结束时间 models TimeField 我想用以下方式注释查询集start datetime and end datetime
  • 在 django 1.7 上的数据迁移中,直到原子块结束后才能执行查询

    我有一个相当长的数据迁移 我正在执行此操作来纠正早期的错误迁移 其中某些行创建不正确 我试图根据旧列将值分配给新列 但是 有时这会导致完整性错误 发生这种情况时 我想扔掉导致完整性错误的那个 这是一个代码片段 def load data a
  • Django 选择性转储数据

    是否可以有选择地过滤哪些记录Django的dumpdata管理命令输出 我有几个模型 每个模型都有数百万行 我只想转储一个模型中符合特定条件的记录 以及引用任何这些记录的所有外键链接记录 考虑这个用例 假设我有一个生产数据库 其中我的用户模
  • Django模型更新或创建具有唯一约束的对象

    有一个模型 class Proxy models Model host models CharField max length 100 port models CharField max length 10 login models Cha
  • 如何从 Django 管理界面禁用“最近操作”小部件?

    我不想展示最近的操作小部件在 django 管理站点中 我不知道如何完成此操作 你可以覆盖admin index html禁用显示的模板 有 您可能想要更改 删除的侧边栏块 有条件地启用或禁用操作 ModelAdmin get action
  • 如何通过 TLS 1.2 运行 django runserver

    我正在本地 Mac OS X 机器上测试 Stripe 订单 我正在实现这段代码 stripe api key settings STRIPE SECRET order stripe Order create currency usd em
  • 带有用户信息的 Django Logger

    我只是好奇 是否可以放User内的信息formatters信息输入LOGGING配置在setting py 现在我只是将该信息放入要记录的消息中 但也许有一种方法可以将其设置为formatters争论 这是我的LOGGING现在的配置 LO

随机推荐

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

    我有一张 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现在可以用作第二个