Looking for django Keywords? Try Ask4Keywords

Django Ärver signaler på utökade modeller


Exempel

Djangos signaler är begränsade till exakta klassunderskrifter vid registrering, och därför klassificeras underklassade modeller inte omedelbart på samma signal.

Ta till exempel den här modellen och signalera

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)

Med utökade modeller måste du ansluta signalen manuellt till varje underklass annars kommer de inte att utföras.

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

Med Python 3.6 kan du utnyttja några ytterligare klassmetoder som byggs in i klasser för att automatisera denna bindning.

class Event(models.Model):

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