私は次のようないくつかの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シグナルは更新時に機能しませんか、それともここで何か他のものが欠けていますか?
ありがとう
update()
はSQLステートメントに直接変換されます ;モデルインスタンスでsave()
を呼び出さないため、_pre_save
_および_post_save
_シグナルは発行されません。シグナルレシーバーを呼び出す場合は、クエリセットをループし、モデルインスタンスごとに変更を加えて、自分でsave()
を呼び出す必要があります。
@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