我正在使用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。
我该怎么做?
答案 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)