около подтверждение модели :
Обратите внимание, что full_clean () не будет вызываться автоматически при вызове метода save () вашей модели
Затем, о pre-save signal
, обратите внимание, что вы получаете экземпляр, который сохраняется, как сообщение с параметром. Поскольку предыдущая версия вашей модели существует только в базе данных, я не вижу, где еще вы могли бы получить предыдущее значение атрибутов ...
Вы не говорите, почему вы хотите это сделать, поэтому сложно сказать, но другие решения, о которых я сейчас думаю:
* defining a custom signal that is sent everytime the attributes you are interested in are modified... This signal would then send two arguments : new value, old value
* perform the check directly when setting the attributes
Если вы дадите больше подробностей, это может быть проще ...
РЕДАКТИРОВАТЬ:
Правильно ... Если вы выберете пользовательское 'foo_has_updated', вы не будете уверены, что модификация сохранена.
В этом случае, я думаю, вы могли бы кэшировать переменные, которые вас интересуют при инициализации экземпляра, и перехватить сигнал после сохранения ИЛИ до сохранения.
* With pre-save, you would be able to pre-process the data, but the saving operation might fail
* With post-save, you would be sure that the data has been saved.
Кэширование ваших переменных может быть сделано так:
class CachedModel(models.Model):
cached_vars = [var1, var2, varN]
def __init__(self, *args, **kwargs):
super(CachedModel, self).__init__(*args, **kwargs)
self.var_cache = {}
for var in self.cached_vars:
self.var_cache[var] = copy.copy(getattr(self, var))
Или как-то так ... Тогда в вашем обработчике сигналов:
def post_save_handler(sender, **kwargs):
instance = kwargs["instance"]
[(instance.var_cache[var], getattr(instance, var)) for var in instance.cached_var]
#[(<initial value>, <saved value>)
И вы получили то, что вам нужно (я думаю) !!!