在Django中,当孩子保存在外键关系中时,如何通知父母?

时间:2008-10-10 17:27:35

标签: python django django-models

我有以下两种模式:

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

我希望活动模型在保存与插入或更新相关的取消时都要注意。

最好的方法是什么?

2 个答案:

答案 0 :(得分:17)

您要查看的内容是Django's signals(请查看this page),特别是模型信号 - 更具体地说, post_save 信号。信号是Django的插件/钩子系统版本。每次保存模型时都会发送post_save信号,无论是更新还是创建(并且它会让您知道它是否已创建)。这是您在活动取消时使用信号获取通知的方式

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)

答案 1 :(得分:4)

以下是什么问题?

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 )

它可以让您非常精确地控制模型之间的通知。在某种程度上,这是规范的“为什么OO这么好?”题。我认为OO很好,因为你的Cancellation和Activity对象的集合可以完全合作。