Django Admin: Обнаружьте, если подмножество поля объекта изменилось и который из них

Я должен обнаружить, когда некоторые поля определенной модели изменились в администраторе, для позже отправки уведомлений в зависимости от который поля измененные и предыдущие / текущие значения тех полей.

Я пытался использовать a ModelForm и переопределение save() метод, но форма self.cleaned_data и seld.instance уже имейте новые значения полей.

7
задан Armando Pérez Marqués 8 March 2010 в 01:59
поделиться

3 ответа

Что вам нужно сделать, так это получить дополнительную копию объекта, над которым вы работаете, из базы данных внутри метода сохранения перед его полным сохранением. Пример:

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()
0
ответ дан 6 December 2019 в 14:03
поделиться

Чтобы получить различия двух экземпляров модели, вы также можете использовать эту функцию . Он сравнивается с экземплярами модели и возвращает словарь изменений.

1
ответ дан 6 December 2019 в 14:03
поделиться

Чтобы избежать лишнего поиска в БД, я изменил конструктор так, чтобы он запомнил начальное значение и позже использовал его в методе сохранения:

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)
7
ответ дан 6 December 2019 в 14:03
поделиться
Другие вопросы по тегам:

Похожие вопросы: