在擴充套件模型上繼承訊號

Django 的訊號在註冊時僅限於精確的類簽名,因此子類模型不會立即註冊到同一訊號上。

以此模型和訊號為例

class Event(models.Model):
    user = models.ForeignKey(User)

class StatusChange(Event):
    ...

class Comment(Event):
    ...

def send_activity_notification(sender, instance: Event, raw: bool, **kwargs):
    """
    Fire a notification upon saving an event
    """

    if not raw:
        msg_factory = MessageFactory(instance.id)
        msg_factory.on_activity(str(instance))
post_save.connect(send_activity_notification, Event)

對於擴充套件模型,你必須手動將訊號附加到每個子類上,否則它們將不受影響。

post_save.connect(send_activity_notification, StatusChange)
post_save.connect(send_activity_notification, Comment)

使用 Python 3.6,你可以利用構建到類中的一些其他類方法來自動化此繫結。

class Event(models.Model):

    @classmethod
    def __init_subclass__(cls, **kwargs):
        super().__init_subclass__(**kwargs)
        post_save.connect(send_activity_notification, cls)