16

我有以下两个模型:

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

我希望 Activity 模型能够知道何时保存与其相关的取消(插入或更新)。

解决此问题的最佳方法是什么?

4

2 回答 2

17

您要查看的是Django 的信号(也请查看此页面),特别是模型信号—​​—更具体地说,是post_save信号。信号是 Django 的插件/挂钩系统版本。每次保存模型时都会发送 post_save 信号,无论它是更新还是创建(它会通知您它是否已创建)。这就是当 Activity 有 Cancellation 时,您将如何使用信号来获得通知

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)
于 2008-10-10T18:18:56.923 回答
5

以下有什么问题?

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 对象的集合可以充分合作。

于 2008-10-10T22:16:49.393 回答