Django custom save mixin

Я создал пользовательскую функцию сохранения, которая имеет определенную логику в зависимости от того, изменилось ли поле модели Django или нет. В основном, я инициализирую и сохраняю интересующие меня поля в рамках метода models init, а затем проверяю, изменились ли эти поля в рамках функции сохранения models.

Все работает хорошо. Но я хотел бы создать это как миксин. Я не уверен, как лучше передать инициализированные параметры внутри миксина. Посоветуйте что-нибудь?

Это работает нормально:

class Model(models.Model):
    field = models.CharField()

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

        self.__field_stored = self.field


    def save(self, *args, **kwargs):
        if self.field != self.__field_stored:
            # do something
    
        super().save(*args, **kwargs)
    
    

Но как миксин? Нижеприведенный вариант, похоже, не работает, вызывая ошибку атрибута:

class Model(SaveMixin, models.Model):
    field = models.CharField()

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

        self.__field_stored = self.field

    def save(self, *args, **kwargs):
        super().save(*args, **kwargs)



class SaveMixin(models.Model):
    field: str
    __field_stored: str

    class Meta:
        abstract = True

    def save(self, *args, **kwargs):
        if self.field != self.__field_stored:
            # do something
    
        super().save(*args, **kwargs)

Для тех, кому интересно... Приведенный выше миксин на самом деле отлично работает. Просто нужно было избежать объявления приватных переменных, таких как __field_stored.

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