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

  • копировать данные из csv в postgresql с помощью python
  • Как выполнить внутреннее соединение в django
  • Pandas записывает данные в другую схему postgresql
  • Интерфейс Python-PostgreSQL psycopg2 -> executemany
  • python 2.7 to python 3.4 ошибка неподдерживаемых типов операндов для%: 'bytes' и 'dict'
  • psycopg2 E 'на столе, поле и схеме
  • Установка расширения hstore в тестах django носа
  • Alembic SqlAlchemy Postgres «NameError: имя« String »не определено», пытаясь добавить поля Array (String)
  • Psycopg2 Вставить в таблицу с заполнителями
  • Как pgBouncer помогает ускорить Django
  • Поиск по нескольким таблицам (лучшие практики)
  • Python - лучший язык программирования в мире.