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代)との間で、下位互換性の無さは尋常じゃないね。。。