37

次のような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オブジェクトの更新の呼び出しによって、2番目のレシーバーが呼び出されることはありません。post_saveシグナルは更新時に機能しませんか、それともここで何か他のものが欠けていますか?

ありがとう

4

2 に答える 2

67

update()SQLステートメントに直接変換されます; モデルインスタンスを呼び出さないsave()ため、pre_saveおよびpost_saveシグナルは発行されません。シグナルレシーバーを呼び出す場合は、クエリセットをループし、モデルインスタンスごとに変更を加えて、save()自分で呼び出す必要があります。

于 2011-09-11T05:32:34.330 に答える
41

@IsmaliBadawiの答えにもう1つだけ。


これ 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
于 2016-02-06T08:08:19.793 に答える