在扩展模型上继承信号
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)