首页 > 解决方案 > 如何修复,PostgreSQL BEFORE UPDATE 触发从 Django 端在与触发器无关的列上执行的选定列?

问题描述

基本上,我正在使用 PostgreSQL 数据库创建一个 Django 应用程序,现在对于数据库上的给定表,我必须使用触发器来防止更新选定列,触发器在数据库端正常工作,做它要做的事情,防止更新选定列并允许使用触发器更新非关联列。

现在从 Django 方面来看,每当我尝试更新与触发器无关的表的字段/列时,它都会调用/执行触发器,以防止对那些不关联的字段/列进行更新操作,并且在尝试时甚至会执行此触发器从 Django 端添加新记录或数据以防止插入新记录。

有人可以帮忙吗?

谢谢

标签: pythondjangodatabasepostgresqltriggers

解决方案


我找到了解决我的问题的方法。

我创建了一个 PostgreSQL 触发器来防止更新一些列。从数据库方面,我对其进行了测试,并且工作正常。问题出在 Django 方面。

在数据库中,可以通过输入一个值来更新单个列,它与其他列没有联系,因此更新特定列不会出错。例如,一行有两个字段,一个可修改,另一个被触发器阻止,因此当我修改该可修改字段时,它将被修改。

Django 的问题,在 Django 中,它总是会写出整个对象。例如,如果您有一个具有两个字段的对象,一个可修改,另一个不可修改,但两者都在 Django 中映射,当您保存该对象时,Django 将更新这两个字段,即使它们中只有一个或没有一个已更改。

当 Django 更新所有字段时,即使只更改了一个字段,触发器也会被调用。

所以我不得不寻找一个选项,它只允许更新指定的字段或更改/修改的字段,而不是其他未更改的字段。

我发现这个 update_fields

update_fields 帮助我确定应该更新哪些字段,而不是更新整行或所有字段。


推荐阅读