如何检查post_save中的模型字段是否已更改?

时间:2018-12-09 13:42:32

标签: python django django-signals

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

试图覆盖这样的初始化方法

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之外)?

1 个答案:

答案 0 :(得分:0)

那是因为您正在使用名称处理。

双下划线(名称修饰)

来自Python文档:

  

任何形式的__spam标识符(至少两个下划线,   在文字上最多替换一个结尾的下划线)   _classname__spam,其中classname是当前的类名,其中前导下划线被去除。这种处理是无视的   到标识符的句法位置,因此可以用来   定义类私有实例和类变量,方法,变量   存储在全局变量中,甚至变量存储在实例中。私人   该类在其他类的实例上。

要访问instance.__old_city,您需要使用_className__attribute_name

因此__old_city将被-> _Profile__old_city

破坏