2011-09-11 18 views
13

Estoy intentando fijar algunos receptores post_save similares a los siguientesDjango post_save señales en la actualización

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

El primer receptor está recibiendo llamadas correctamente después de una actualización sobre el objeto del juego, sin embargo, las llamadas para actualizar el El objeto MyPick no está causando que se llame al segundo receptor. ¿La señal post_save no funciona en la actualización o me falta algo más aquí?

Gracias

Respuesta

39

update() is converted directly to an SQL statement; no llama al save() en las instancias del modelo, por lo que las señales pre_save y post_save no se emiten. Si desea que se llamen sus receptores de señal, debe recorrer el conjunto de consulta, y para cada instancia de modelo, realice los cambios y llame al save() usted mismo.

+21

@SilverLight, el método 'update' en instancias modelo emite' pre_save'. El método 'update' en querysets no. –

+0

Para que quede claro, ¿el método 'update' en una instancia modelo también emite' post_save', o solo 'pre_save'? – guival

9

Solo una cosa más a la respuesta de @Ismali Badawi.


Este llamadapost_save

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

Este no llamapost_save

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

En el código,

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 
Cuestiones relacionadas