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