継承されたシグナルレシーバーを@receiver
デコレーターと連携させることができました。関連するDjangoのドキュメントを参照してください
from django.db import models
from django.db.models.signals import post_save
from django.dispatch import receiver
class Animal(models.Model):
category = models.CharField(max_length=20)
@receiver(post_save)
def echo_category(sender, **kwargs):
print ("category: '%s'" % kwargs['instance'].category)
class Dog(Animal):
color = models.CharField(max_length=10)
このソリューションはPython3.6.8Django2.2で有効です
私がこれをするとき
>>> from myapp.models import Dog
>>> dog = Dog()
>>> dog.category = "canine"
>>> dog.save()
category: 'canine'
>>>
問題はありません。すべてがシェルから機能しているようです。
少し関係ありませんが、管理パネルでモデルを編集したところ、2回呼び出されるという問題があったので、'created'
kwargをチェックしてフィルタリングしました。1つの呼び出しではそれは偽であり、他の呼び出しではそれは真だったので、単純なifブロックを入れました。その回避策の功績は、Pratik Mandrekarと彼の答えにあります:
from django.db import models
from django.db.models.signals import post_save
from django.dispatch import receiver
class Animal(models.Model):
category = models.CharField(max_length=20)
@receiver(post_save)
def echo_category(sender, **kwargs):
if not kwargs.get('created'):
print ("category: '%s'" % kwargs['instance'].category)
class Dog(Animal):
color = models.CharField(max_length=10)