No Django como eu notificar um dos pais quando uma criança é salva em um relacionamento de chave estrangeira?

votos
14

Eu tenho os dois modelos seguintes:

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)
    ...

Gostaria que o modelo de Atividade estar ciente quando um cancelamento relacionado a ele é salvo (ambos inseridos ou atualizados).

Qual é a melhor maneira de ir sobre isso?

Publicado 10/10/2008 em 18:27
fonte usuário
Em outras línguas...                            


2 respostas

votos
17

O que você quer é olhar para os sinais do Django (confira desta página também), especificamente os sinais modelo - mais especificamente, o post_save sinal. Os sinais são a versão de Django de um sistema de plugin / gancho. O sinal post_save é enviado cada vez que um modelo é salvo, se ele está atualizado ou criado (e ele vai deixar você saber se ele foi criado). Isto é como você usaria sinais para ser notificado quando uma atividade tem um cancelamento

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)
Respondeu 10/10/2008 em 19:18
fonte usuário

votos
3

O que há de errado com o seguinte?

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 )

Ele permitirá que você para controlar a comunicação entre os modelos com muita precisão. De certa forma, esta é a canônica "Por que é OO tão bom?" questão. Eu acho que OO é bom precisamente porque a sua coleção de Cancelamento e objetos de atividades podem cooperar plenamente.

Respondeu 10/10/2008 em 23:16
fonte usuário

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more