为啥 Django 关系字段中不存在“on_update”选项?

Posted

技术标签:

【中文标题】为啥 Django 关系字段中不存在“on_update”选项?【英文标题】:Why is the "on_update" option not present in Django Relationship fields?为什么 Django 关系字段中不存在“on_update”选项? 【发布时间】:2020-05-07 01:31:46 【问题描述】:

我正在使用 Django 3.0 + MariaDB。 我使用“python manage.py inspectdb > models.py”命令从现有数据库创建了一个 models.py。 我现在需要设置外键的选项。 如您所知,在数据库中您可以有多个外键选项:第一个经典是“ON_DELETE”,第二个是“ON_UPDATE”(您甚至可以在 PostgreSQL 中拥有更多选项)。 在 Django 中,只有一个“on_delete”,但没有“on_update”选项,这让我很惊讶。 我在官方文档中没有发现任何关于此的内容。 在一些具有相同问题的旧帖子上,回复都不是结论性的,而是集中在“on_delete”上。 我问的是“ON_UPDATE”选项,没有别的。 那么,这个选项在哪里,或者为什么它没有出现在 Django 的 ORM 中?

【问题讨论】:

你想用 on_update 实现什么,但是没有它你在 Django 中不能做 好吧,如果您出于任何原因需要更改 id(通常是为了修复错误数据),也可以使用“on_update”选项更新链接数据。我的数据库是这样配置的,而且效果很好。如果没有这个选项,它可能会很费力,特别是有数百万个条目。 【参考方案1】:

即使是on_delete,Django 也没有真正使用数据库级联选项

on_delete 不会在数据库中创建 SQL 约束。支持 数据库级级联选项可能会在以后实现。

由于您的应用可以对pre_deletepost_delete 信号做出反应,因此具有以下便利优势,但在性能方面也存在轻微劣势


关于ON_UPDATE

它没有实现,而且很少使用,因为通常你永远不会改变你的模型 ID

如果您需要数据库级别的特定内容或在应用程序级别进行模拟以获得更好的控制(例如覆盖模型保存方法),您仍然可以创建 SQL 迁移


关于与外键无关的其他数据库约束,有与它们相关的文档here 和特定于 postgreSQL 的文档here

【讨论】:

我没有什么特别的,我只是想确保如果主键因任何原因被修改,链接数据也会更新。这就是 ON_UPDATE 选项的目的。 我想我会保持它在数据库中的样子。如果我理解正确,Django ORM 将不会访问此选项,这是我想确定的。

以上是关于为啥 Django 关系字段中不存在“on_update”选项?的主要内容,如果未能解决你的问题,请参考以下文章

为啥我会收到此错误错误状态:使用 Firestore 时 DocumentSnapshotPlatform 中不存在字段?

在 Django Admin 中创建自定义显示字段(models.py 中不存在)

为啥可选择的项目列表在 Django 中不起作用?

Django Modelform - 它没有验证,为啥?

为啥“发布”方法在我的 django 应用程序中不起作用?

当我将可选参数传递给视图时,为啥我的 CSS 静态文件在 Django 中不起作用?