Looking for django Keywords? Try Ask4Keywords

Django Vererbung von Signalen bei erweiterten Modellen


Beispiel

Die Signale von Django sind bei der Registrierung auf genaue Klassensignaturen beschränkt, so dass Unterklassenmodelle nicht sofort auf demselben Signal registriert werden.

Nehmen Sie dieses Modell und signalisieren Sie es zum Beispiel

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)

Bei erweiterten Modellen müssen Sie das Signal manuell an jede Unterklasse anhängen, andernfalls werden sie nicht beeinflusst.

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

Mit Python 3.6 können Sie einige zusätzliche Klassenmethoden für Klassen nutzen, um diese Bindung zu automatisieren.

class Event(models.Model):

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