2011-09-11 35 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