Django Как очистить, если значение изменено в методе сохранения модели

У меня есть модель, подобная этой:

class Exam(BaseModel):
    ...
    STATE_CHOICES = (
        (PASS, PASS),
        (FAILED, FAILED),
        (GREAT, GREAT),
    state = models.CharField(max_length=15, choices=STATE_CHOICES, default=PASS)
    ...

Теперь я хочу задействовать метод сохранения и узнать, изменилось ли поле state или нет:

    def save(self, force_insert=False, force_update=False, using=None, update_fields=None):
        if self.__state != self.state:
            print('changed')
        super().save(force_insert, force_update, using, update_fields)

self.__state кажется неправильным, как я могу это сделать?

По сути, вы хотите переопределить метод init в models.Model, чтобы сохранить копию исходного значения. Это позволит вам не выполнять повторный поиск в БД (что всегда хорошо).

class Exam(models.Model):
    STATE_CHOICES = (
    ("PASS", "PASS"),
    ("FAILED", "FAILED"),
    ("GREAT", "GREAT"),)
    state = models.CharField(max_length=15, choices=STATE_CHOICES, default="PASS")

    __original_state = None

    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)
        self.__original_state = self.state

    def save(self, force_insert=False, force_update=False, *args, **kwargs):
        if self.state != self.__original_state:
            print("changed")
            # state changed - do something here

        super().save(force_insert, force_update, *args, **kwargs)
        self.__original_state = self.state

Этот вопрос был тщательно решен и обсужден в этой теме, включая крайние случаи, ограничения и преимущества каждого подхода.

Нет необходимости писать это самостоятельно. Используйте Fieldtracker из пакета model_utils, чтобы проверить, изменились ли данные: https://django-model-utils.readthedocs.io/en/latest/utilities.html#field-tracker

Вернуться на верх