检测模型的变化

时间:2016-05-31 09:27:57

标签: django django-models

我正在使用Django作为Web应用程序,我想实现一些代码来检测模型中的更改(并使用它来更新模型)。我摆弄了save

class MyModel(models.Model):
    def save(self, *args, **kw):
        if self.somevalue == 0:
            self.someothervalue = timezone.now()
        else:
            self.someothervalue = None

        super(MyModel, self).save(*args, **kw)

但是当someothervalue已经 0时,这也会将timezone.now()更新为somevalue。我希望它仅在变为 0。

我该怎么做?

2 个答案:

答案 0 :(得分:1)

未经测试但应该有效。您将先前的值缓存在__init__中,并检测它是否在save内发生了变化。

class MyModel(models.Model):

    def __init__(self, *args, **kwargs):
        super(MyModel, self).__init__(*args, **kwargs)
        self.prev_somevalue  = self.somevalue

    def save(self, *args, **kw):
        if self.somevalue == 0 and self.prev_somevalue != self.somevalue:
            self.someothervalue = timezone.now()
        else:
            self.someothervalue = None

        super(MyModel, self).save(*args, **kw)

或者,如果您使用的是表单,则可以使用changed_data属性在ModelForm级别上执行此操作。

最后,如果您想使用信号,您应该使用pre_save信号并从数据库中检索前一个信号。

答案 1 :(得分:0)

我更喜欢这种检查保存方法中的更改的方法:

class MyModel(models.Model)

    def save(self, *args, **kwargs):
        db_object = MyModel.objects.get(id=self.id) # this is the copy of the object saved in the database
        if self.somevalue == 0 and db_object.somevalue != 0:
            self.someothervalue = timezone.now()
        else:
            self.someothervalue = None

        super(MyModel, self).save(*args, **kwargs)