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) и проверить различия в текущем экземпляре и предыдущем экземпляре.

  • Python + PostgreSQL + странная ошибка ascii = UTF8
  • Django + Postgres + Большая серия времени
  • Как я могу объединить соединения с помощью psycopg и gevent?
  • cursor.execute ("INSERT INTO im_entry.test (" + entrym + ") VALUES ('" + p + "');")
  • Сохранять порядок списка в разбивке по страницам в sql
  • Диспетчер флагов-Admin Много-ко-многим
  • Heroku отказывается от подключения к базе данных postgres
  • Невозможно найти модули приложения Django на AWS Elastic Beanstalk
  • Python - лучший язык программирования в мире.