2011-09-11 34 views
13

我试图建立一个类似以下Django的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''' 

一些post_save接收机的第一接收机是获得游戏对象上的更新后正确调用,但是调用上的更新MyPick对象不会导致第二个接收器被调用。 post_save信号不能在更新上工作,或者我在这里丢失了别的东西吗?

谢谢

回答

39

update() is converted directly to an SQL statement;它不会在模型实例上调用save(),因此不会发射pre_savepost_save信号。如果您希望调用信号接收器,则应循环查询集,并为每个模型实例进行更改并自行致电save()

+21

@SilverLight,模型实例上的'update'方法发出'pre_save'。查询集上的'update'方法没有。 –

+0

只需清楚一点:模型实例上的'update'方法是否也会抛出'post_save',或者只抛出'pre_save'? – guival

9

只是@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