1.0(pre)ではdispatch.connectではなく、signals.hogehoge.connect
modelsでは、DBへのアクセスをフックして、ある程度オレ様処理を追加することができる。
と、いうのは既知らしい。
ところが、modelが派生関係で、親にしかフックのコードを実装した場合の例が無かった。
書籍通りでは、当然のごとく動かなかったし、下手にsenderを指定すると絞り込まれてうまくいかなかった。
ので、これをメモしてみる。
正しくない可能性は大(スマートでないので)。
親子関係は下記のような感じ。
親:ManagedModel
子:InstanceSetting
from django.db.models import signals class ManagedModel(models.Model): created = models.DateTimeField(u'作成日時', blank=True) creator = models.CharField(u'作成者', max_length=1024) updated = models.DateTimeField(u'更新日時', blank=True) updator = models.CharField(u'更新者', max_length=1024) class Meta: abstract = True def mm_pre_save(signal, sender, instance, **kwds): if isinstance(instance, ManagedModel): if not instance.id: instance.created = datetime.now() instance.updated = datetime.now() signals.pre_save.connect(mm_pre_save) class InstanceSetting(ManagedModel): owner_id = models.CharField(u'所有者ID', max_length=1024) owner_type = models.CharField(u'所有者型', max_length=1024) name = models.CharField(u'名前', max_length=1024) def __unicode__(self): return u'%s, %s, %s' % (self.owner_id, self.owner_type, self.name) class Meta(ManagedModel.Meta): unique_together = (('owner_id', 'owner_type'),)
これを、下記のようにすると、NG。
signals.pre_save.connect(mm_pre_save, sender=ManagedModel)
もっとスマートな方法はあると思うけど、シンプルなので、ひとまずこれで。
それにしても、1.0betaとそれ以前(0.9代)との間で、下位互換性の無さは尋常じゃないね。。。