16

次の2つのモデルがあります。

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

それに関連する Cancellation が保存されたとき (挿入または更新されたとき) に、Activity モデルが認識できるようにしたいと思います。

これについて最善の方法は何ですか?

4

2 に答える 2

17

調べたいのは、Djangoのシグナル(このページもチェックしてください)、具体的にはモデルシグナル、より具体的には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)
于 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 が優れているのか」という標準的なものです。質問。Cancellation オブジェクトと Activity オブジェクトのコレクションが完全に連携できるからこそ、オブジェクト指向が優れていると思います。

于 2008-10-10T22:16:49.393 に答える