Django: как получить доступ к оригинальному (немодифицированному) экземпляру в сигнале post_save

Я хочу сделать денормализацию данных для лучшей производительности и поместить сумму голосов, получаемую моим сообщением в блоге Post model:

class Post(models.Model): """ Blog entry """ author = models.ForeignKey(User) title = models.CharField(max_length=255) text = models.TextField() rating = models.IntegerField(default=0) # here is the sum of votes! class Vote(models.Model): """ Vote for blog entry """ post = models.ForeignKey(Post) voter = models.ForeignKey(User) value = models.IntegerField() 

Конечно, мне нужно сохранить значение Post.rating . Nornally я использовал бы триггеры базы данных для этого, но теперь я решил сделать post_save сигнал (чтобы сократить время обработки базы данных):

 # vote was saved @receiver(post_save, sender=Vote) def update_post_votes(sender, instance, created, **kwargs): """ Update post rating """ if created: instance.post.rating += instance.value instance.post.save() else: # if vote was updated, we need to remove the old vote value and add the new one # but how...? 

Как я могу получить доступ к значению экземпляра до его сохранения? В триггеры базы данных у меня бы были OLD и NEW для этого, но есть ли что-то подобное в сигналах post_save?

ОБНОВИТЬ

Решение, основанное на ответе Марка:

 # vote was saved @receiver(pre_save, sender=Vote) def update_post_votes_on_save(sender, instance, **kwargs): """ Update post rating """ # if vote is being updated, then we must remove previous value first if instance.id: old_vote = Vote.objects.get(pk=instance.id) instance.post.rating -= old_vote.value # now adding the new vote instance.post.rating += instance.value instance.post.save() 

One Solution collect form web for “Django: как получить доступ к оригинальному (немодифицированному) экземпляру в сигнале post_save”

Я считаю, post_save слишком поздно, чтобы получить неизмененную версию. Как следует из названия, данные уже были записаны в db в этот момент. pre_save этого вы должны использовать pre_save . В этом случае вы можете извлечь модель из db через pk: old = Vote.objects.get(pk=instance.pk) и проверить различия в текущем экземпляре и предыдущем экземпляре.

Interesting Posts

Как бы вы выполняли эквивалент препроцессорных директив в Python?

Использование Firefox с Selenium webdriver не записывает историю

Python, создающий калькулятор

Предоставляет ли python официальную поддержку повторного использования переменной цикла после цикла?

Пользовательский конвертер Boost.Python

Подключение к серверу Sql с помощью Python 3 в Windows

Рекурсивный ввод в Python 3.5+

Как добавить автоматический фильтр к отношению с SQLAlchemy?

Аутентифицированный, но user.is_authenticated остается ложным

Каков самый простой способ заставить matplotlib в OSX работать в виртуальной среде?

Ошибка компиляции пин-инструмента с помощью python включает в себя получение ошибки C2872: 'UINT32': неоднозначный символ

Вариант «symlog» Matplotlib: как предотвратить кривые, которые «возвращаются»?

Как разбить линию цепочечных методов в Python?

Петли для вывода последовательности – python

Бит Setuid в скрипте python: Linux против Solaris

Python - лучший язык программирования в мире.