检测模型的变化[重复]

Posted

技术标签:

【中文标题】检测模型的变化[重复]【英文标题】:Detecting a change in model [duplicate] 【发布时间】:2016-09-29 05:44:33 【问题描述】:

我正在将 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)

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

我该怎么做?

【问题讨论】:

听起来你想使用signals。 @solarissmoke 我检查了,但我似乎没有“旧”实例,就像我在数据库中使用更新触发器一样。 【参考方案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 信号并从数据库中检索以前的信号。

【讨论】:

【参考方案2】:

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

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)

【讨论】:

以上是关于检测模型的变化[重复]的主要内容,如果未能解决你的问题,请参考以下文章

Angular 1.6.4如何检测组件的无绑定属性的变化[重复]

统一3D中fbx模型的尺寸变化[重复]

Angular,打字稿更改检测输入文本[重复]

ios检测心率[重复]

如何检测iphone4s [重复]

检测使用jQuery更改的禁用属性[重复]