Я должен обнаружить, когда некоторые поля определенной модели изменились в администраторе, для позже отправки уведомлений в зависимости от который поля измененные и предыдущие / текущие значения тех полей.
Я пытался использовать a ModelForm
и переопределение save()
метод, но форма self.cleaned_data
и seld.instance
уже имейте новые значения полей.
Что вам нужно сделать, так это получить дополнительную копию объекта, над которым вы работаете, из базы данных внутри метода сохранения перед его полным сохранением. Пример:
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()
Чтобы получить различия двух экземпляров модели, вы также можете использовать эту функцию . Он сравнивается с экземплярами модели и возвращает словарь изменений.
Чтобы избежать лишнего поиска в БД, я изменил конструктор так, чтобы он запомнил начальное значение и позже использовал его в методе сохранения:
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)