6

Djangoでは、マルチテーブル継承を使用するモデルがあり、親クラスでpost_saveシグナルのレシーバーを定義した場合、子クラスのインスタンスが保存されたときにそのレシーバー関数が呼び出されますか?

別の質問から例を借りる:

class Animal(models.Model):
    category = models.CharField(max_length=20)

class Dog(Animal):
    color = models.CharField(max_length=10)

def echo_category(sender, **kwargs):
    print "category: '%s'" % kwargs['instance'].category

post_save.connect(echo_category, sender=Animal)

私が行った場合:

>>> dog = Dog.objects.get(...)
>>> dog.category = "canine"
>>> dog.save()

echo_categoryレシーバー関数は呼び出されますか?

4

4 に答える 4

15
post_save.connect(my_handler, ParentClass)
# connect all subclasses of base content item too
for subclass in ParentClass.__subclasses__():
    post_save.connect(my_handler, subclass)

ごきげんよう!

于 2014-07-08T06:13:25.187 に答える
3

チェックアウト: https ://code.djangoproject.com/ticket/9318 ほとんどがサブクラスのスーパーに信号を伝播しているようです。

于 2013-02-07T18:44:51.300 に答える
1

いいえ、呼び出されません。Django tracの#9318を参照してください。

于 2013-02-07T18:44:25.373 に答える
1

継承されたシグナルレシーバーを@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)
于 2019-05-25T19:37:09.897 に答える