django post_save更新信号

use*_*918 20 django django-signals

我正在尝试设置一些类似于以下的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'''
Run Code Online (Sandbox Code Playgroud)

在Game对象更新后,第一个接收器被正确调用,但MyPick对象上的更新调用不会导致第二个接收器被调用.post_save信号不能用于更新,还是我在这里丢失了其他内容?

谢谢

Ism*_*awi 48

update()直接转换为SQL语句 ; 它不会调用save()模型实例,因此不会发出pre_savepost_save信号.如果您希望调用信号接收器,则应该遍历查询集,并为每个模型实例进行更改并自行调用save().

  • @SilverLight,模型实例上的`update`方法发出`pre_save`.查询集上的`update`方法没有. (24认同)
  • 只是要清楚:模型实例上的“update”方法是否也发出“post_save”,还是只发出“pre_save”? (2认同)
  • 但是...是什么让我想知道... `update_or_create` 会触发 `post_save` 信号。 (2认同)

Che*_*mer 19

对@Ismali Badawi的回答还有一件事.


这个电话 post_save

user = User.objects.get(id=1) 
user.username='edited_username' 
user.save()
Run Code Online (Sandbox Code Playgroud)

不打电话 post_save

User.objects.filter(id=1).update(username='edited_username')
Run Code Online (Sandbox Code Playgroud)

在代码中,

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
Run Code Online (Sandbox Code Playgroud)