首页 文章

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

提问于
浏览
0

如果其中一个模型字段已更新,我必须在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:'Profile'对象没有属性'__old_city'

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

1 回答

  • 0

    多数民众赞成因为你使用名称错误 .

    双下划线(名称管理)

    从Python文档:

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

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

    所以 __old_city 将被破坏 -> _Profile__old_city

相关问题