【问题标题】: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 我检查了,但我似乎没有“旧”实例,就像我在数据库中使用更新触发器一样。

标签: django django-models


【解决方案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)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-07-04
      • 2020-07-27
      • 2013-03-03
      • 1970-01-01
      • 2013-05-17
      • 2017-12-08
      • 1970-01-01
      相关资源
      最近更新 更多