Как я могу проверить, было ли изменено поле модели в post_save? - PullRequest
0 голосов
/ 09 декабря 2018

Мне нужно сделать некоторую дополнительную логику в post_save, если было обновлено одно из полей модели, но я не могу проверить, было ли оно обновлено.

Попытка переопределить метод init, подобный этому

def __init__(self, *args, **kwargs):
    super(Profile, self).__init__(*args, **kwargs)
    self.__old_city = self.city

и в post_save проверяют

if instance.city != instance.__old_city:
    #extra logic

, но получили исключение

AttributeError: у объекта «Профиль» нет атрибута «__old_city»

Чтоя делаю неправильно (кроме использования сигналов: D)?

1 Ответ

0 голосов
/ 09 декабря 2018

Это потому, что вы используете искажающее имя.

Двойной знак подчеркивания (искажение имени)

Из документов Python:

Любой идентификатор формы __spam (вкак минимум два начальных подчеркивания, самое большее одно конечное подчеркивание) текстуально заменяется на _classname__spam, где classname - это имя текущего класса с удаленными начальными подчеркиваниями.Это искажение выполняется без учета синтаксической позиции идентификатора, поэтому его можно использовать для определения переменных экземпляра класса и класса, методов, переменных, хранящихся в глобальных переменных, и даже переменных, хранящихся в экземплярах.Приватный к этому классу на экземплярах других классов.

Что означает доступ к instance.__old_city, вам нужно использовать _className__attribute_name

Так что __old_city будет искажен -> _Profile__old_city

...