Подтвердить что ты не робот

Django post_save сигналы при обновлении

Я пытаюсь настроить некоторые приемники 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 не работает при обновлении или я пропущу что-то еще здесь?

Спасибо

4b9b3361

Ответ 1

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

Ответ 2

Еще одна вещь в ответе @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