2008-10-10 13 views
14

que tienen los dos modelos siguientes:En Django, ¿cómo notifico a un padre cuando un niño se guarda en una relación de clave externa?

class Activity(models.Model): 
    name = models.CharField(max_length=50, help_text='Some help.') 
    entity = models.ForeignKey(CancellationEntity) 
    ... 


class Cancellation(models.Model): 
    activity = models.ForeignKey(Activity) 
    date = models.DateField(default=datetime.now().date()) 
    description = models.CharField(max_length=250) 
    ... 

Me gustaría que el modelo de actividad a tener en cuenta cuando se guarda una cancelación relacionado con él (tanto insertadas o actualizadas).

¿Cuál es la mejor manera de hacerlo?

Respuesta

17

Lo que se quiere estudiar es Django's signals (echa un vistazo a this page también), concretamente las señales de modelo - más específicamente, la señal post_save. Las señales son la versión de Django de un sistema de complemento/gancho. La señal post_save se envía cada vez que se guarda un modelo, ya sea que esté actualizado o creado (y le avisará si fue creado). Así es como usarías las señales para recibir notificaciones cuando una actividad tiene una cancelación

from django.db.models.signals import post_save 

class Activity(models.Model): 
    name = models.CharField(max_length=50, help_text='Some help.') 
    entity = models.ForeignKey(CancellationEntity) 

    @classmethod 
    def cancellation_occurred (sender, instance, created, raw): 
     # grab the current instance of Activity 
     self = instance.activity_set.all()[0] 
     # do something 
    ... 


class Cancellation(models.Model): 
    activity = models.ForeignKey(Activity) 
    date = models.DateField(default=datetime.now().date()) 
    description = models.CharField(max_length=250) 
    ... 

post_save.connect(Activity.cancellation_occurred, sender=Cancellation)
+0

Su método 'cancellation_occurred' debe tomar' ** kargs'. ej. 'cancellation_occurred (sender, instance, created, raw, ** kargs'. Puede encontrar esto especificado en las [señales] (https://docs.djangoproject.com/en/dev/topics/signals/#receiver -funciones) página en el segundo/tercer párrafo de _receiver functions_ – thomas

3

¿Qué pasa con lo siguiente?

class Cancellation(models.Model): 
    blah 
    blah 
    def save(self, **kw): 
     for a in self.activity_set.all(): 
      a.somethingChanged(self) 
     super(Cancellation, self).save(**kw) 

Le permitiría controlar la notificación entre los modelos con mucha precisión. En cierto modo, este es el canónico "¿Por qué OO es tan bueno?" pregunta. Creo que OO es bueno precisamente porque su colección de objetos de Cancelación y Actividad puede cooperar completamente.

+0

Considerando 'Activity' y' Cancellation' están estrechamente relacionados, creo que esta es una mejor solución. – muhuk

Cuestiones relacionadas