Django 更新时的 post_save 信号

44 投票
2 回答
49835 浏览
提问于 2025-04-17 02:00

我正在尝试设置一些类似下面的 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 个回答

50

再补充一点关于@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
75

update() 这个方法直接转换成 SQL 语句;它不会对模型实例调用 save() 方法,所以 pre_savepost_save 这些信号就不会被触发。如果你想让你的信号接收器被调用,你需要遍历查询集,对每个模型实例进行修改,然后自己调用 save() 方法。

撰写回答