我需要在管理员中检测某些模型的字段何时发生了更改,以便根据更改的字段和这些字段的先前/当前值稍后发送通知。
我尝试使用ModelForm
并重写save()
方法,但表单的self.cleaned_data
和seld.instance
已经具有字段的新值。
我需要在管理员中检测某些模型的字段何时发生了更改,以便根据更改的字段和这些字段的先前/当前值稍后发送通知。
我尝试使用ModelForm
并重写save()
方法,但表单的self.cleaned_data
和seld.instance
已经具有字段的新值。
def get_changes_between_models(model1, model2, excludes = []):
changes = {}
for field in model1._meta.fields:
if not (field.name in excludes):
if field.value_from_object(model1) != field.value_from_object(model2):
changes[field.verbose_name] = (field.value_from_object(model1),
field.value_from_object(model2))
return changes
在你的代码中,你可以这样写(出于性能原因,请避免使用try/except):
if (self.id):
old = MyModel.Objects.get(pk=self.id)
changes = get_changes_between_models(self, old)
if (changes):
# Process based on what is changed.
class Package(models.Model):
feedback = models.IntegerField(default = 0, choices = FEEDBACK_CHOICES)
feedback_time = models.DateTimeField(null = True)
def __init__(self, *args, **kw):
super(Package, self).__init__(*args, **kw)
self._old_feedback = self.feedback
def save(self, force_insert=False, force_update=False, *args, **kwargs):
if not force_insert and self.feedback != self._old_feedback:
self.feedback_time = datetime.utcnow()
return super(Package, self).save(force_insert, force_update, *args, **kwargs)
class MyModel(models.Model):
field1 = models.CharField(max_length=50)
def save(self):
if self.id:
try:
old = MyModel.objects.get(pk=self.id)
if old.field1 != self.field1:
# Process somehow
except MyModel.DoesNotExist:
pass
super(MyModel, self).save()
Field.value_from_object()
的提示!显然它提供了一种一致比较值的方式。不错! - Armando Pérez Marqués