django post_save сигнализирует об обновлении - PullRequest
18 голосов
/ 11 сентября 2011

Я пытаюсь настроить некоторые приемники post_save, подобные следующим:

@receiver(post_save, sender=Game, dispatch_uid='game_updated')
def game_updated(sender, **kwargs):

    '''DO SOME STUFF HERE'''

    MyPick.objects.filter(week=game.week, team=game.home_team).update(result=home_result)
    MyPick.objects.filter(week=game.week, team=game.away_team).update(result=away_result)


@receiver(post_save, sender=MyPick, dispatch_uid='user_pick_updated')
def update_standings(sender, **kwargs):
    '''DO STUFF'''

Первый получатель правильно вызывается после обновления объекта Game, однако вызовы для обновления объекта MyPickне вызывая второй получатель для вызова.Сигнал post_save не работает при обновлении или я что-то здесь упускаю?

Спасибо

Ответы [ 2 ]

48 голосов
/ 11 сентября 2011

update() преобразуется непосредственно в оператор SQL ;он не вызывает save() на экземплярах модели, поэтому сигналы pre_save и post_save не излучаются.Если вы хотите, чтобы ваши приемники сигналов вызывались, вам следует перебрать набор запросов, и для каждого экземпляра модели внести свои изменения и вызвать save() самостоятельно.

17 голосов
/ 06 февраля 2016

Еще одна вещь в ответе @Ismali Badawi.


Этот звонит post_save

user = User.objects.get(id=1) 
user.username='edited_username' 
user.save()

Этот не вызывает post_save

User.objects.filter(id=1).update(username='edited_username')

В коде

from django.db.models.signals import post_save

@receiver(post_save, sender=User)
def do_something_when_user_updated(sender, instance, created, **kwargs):
    if not created:
        # User object updated
        user_obj = instance
        pass
...