Looking for django Keywords? Try Ask4Keywords

Django Наследование сигналов на расширенных моделях


пример

Сигналы 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)