首页 > 解决方案 > 如何检查 post_save 中的模型字段是否已更改?

问题描述

如果模型字段之一已更新,我必须在 post_save 中执行一些额外的逻辑,但无法检查它是否已更新。

试图像这样覆盖init方法

def __init__(self, *args, **kwargs):
    super(Profile, self).__init__(*args, **kwargs)
    self.__old_city = self.city

并在 post_save 检查

if instance.city != instance.__old_city:
    #extra logic

但有一个例外

AttributeError:“配置文件”对象没有属性“__old_city”

我做错了什么(除了使用信号:D)?

标签: pythondjangodjango-signals

解决方案


那是因为您使用的名称修饰。

双下划线(名称修饰)

来自 Python 文档:

__spam 形式的任何标识符(至少两个前导下划线,最多一个尾随下划线)在文本上被替换为 _classname__spam,其中类名是当前类名,前导下划线被去除。这种修饰是在不考虑标识符的语法位置的情况下完成的,因此它可以用于定义类私有实例和类变量、方法、存储在全局变量中的变量,甚至是存储在实例中的变量。在其他类的实例上对此类是私有的。

这意味着访问instance.__old_city您需要使用_className__attribute_name

所以__old_city会被破坏-> _Profile__old_city


推荐阅读