保存模型后,我正在使用django的post_save信号执行一些语句。

class Mode(models.Model):
    name = models.CharField(max_length=5)
    mode = models.BooleanField()


from django.db.models.signals import post_save
from django.dispatch import receiver

@receiver(post_save, sender=Mode)
def post_save(sender, instance, created, **kwargs):
        # do some stuff
        pass

现在,我想根据mode字段的值是否已更改执行一条语句。
@receiver(post_save, sender=Mode)
def post_save(sender, instance, created, **kwargs):
        # if value of `mode` has changed:
        #  then do this
        # else:
        #  do that
        pass

我查看了一些SOF线程和一个博客,但找不到解决方案。他们所有人都试图使用pre_save方法或非我用例的形式。 django文档中的https://docs.djangoproject.com/es/1.9/ref/signals/#post-save没有提到执行此操作的直接方法。

以下链接中的答案看起来很有希望,但我不知道如何使用。我不确定最新的django版本是否支持它,因为我使用ipdb进行了调试,发现instance变量没有属性has_changed,如下面的答案所述。

Django: When saving, how can you check if a field has changed?

最佳答案

将其设置在模型的__init__上,以便您可以访问它。

def __init__(self, *args, **kwargs):
    super(YourModel, self).__init__(*args, **kwargs)
    self.__original_mode = self.mode

现在您可以执行以下操作:
if instance.mode != instance.__original_mode:
    # do something useful

10-07 18:40