检测模型的变化[重复]
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)
【讨论】:
以上是关于检测模型的变化[重复]的主要内容,如果未能解决你的问题,请参考以下文章