python - queryset - En Django, ¿cómo notifico a un padre cuando un niño se guarda en una relación de llave extranjera?
models py python (2)
¿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.
Tengo los siguientes dos modelos:
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 tenga en cuenta cuándo se guarda una Cancelación relacionada con ella (tanto insertada como actualizada).
¿Cuál es la mejor manera de hacerlo?
Lo que quiere ver son las señales de Django (vea también esta página ), específicamente las señales del modelo, más específicamente, la señal de 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 tenga 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)