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)