2011-09-11 9 views
13

Próbuję skonfigurować niektóre odbiorniki post_save podobne do poniższegoDjango post_save sygnałów na aktualizację

@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''' 

Pierwszy odbiornik jest uzyskiwanie zwane poprawnie po aktualizacji na obiekcie gra, jednak rozmowy, aby aktualizować na Obiekt MyPick nie powoduje wywołania drugiego odbiornika. Czy sygnał post_save nie działa przy aktualizacji lub czy brakuje tu czegoś innego?

Dzięki

Odpowiedz

39

update() is converted directly to an SQL statement; nie wywołuje on save() w wystąpieniach modelu, więc sygnały pre_save i post_save nie są emitowane. Jeśli chcesz, aby twoje odbiorniki sygnału były wywoływane, powinieneś wykonać pętlę nad zestawem zapytań, a dla każdej instancji modelu dokonać zmian i zadzwonić pod numer save().

+21

@SilverLight, metoda 'update' na instancjach modelu emituje' pre_save'. Metoda "update" w zapytaniach nie ma. –

+0

Po prostu, aby było jasne: Czy metoda 'update' w instancji modelu emituje również' post_save' lub tylko 'pre_save'? – guival

9

Jeszcze jedna rzecz do odpowiedzi @Ismali Badawiego.


Ten wezwaniepost_save

user = User.objects.get(id=1) 
user.username='edited_username' 
user.save() 

Ten nie wymagapost_save

User.objects.filter(id=1).update(username='edited_username') 

W kodzie

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