您可以制作一个装饰器,使用传递的模型类来注册信号:
from django.db.models.signals import post_save
def notify_created(sender, instance, created, **kwargs):
channel_layer = channels.layers.get_channel_layer()
group_name = f'notifications_{instance.company.id}'
async_to_sync(channel_layer.group_send)(
group_name,
{
'type': 'notify_change',
},
)
def custom_signal_decorator(model):
post_save.connect(notify_created, sender=model)
return model
并像这样使用它:
@custom_signal_decorator
class Post(models.Model):
company = models.ForeignKey(Company, on_delete=models.CASCADE)
title = models.CharField(max_length=100)
我们可以检查模型是否包含
company_id
字段,从而防止将装饰器添加到与信号不兼容的模型中:
def custom_signal_decorator(model):
model._meta.get_field('company_id')
post_save.connect(notify_created, sender=model)
return model
笔记
:您可以通过使用来提高查询相关对象主键的性能
company_id
而不是
company.id
。这将直接访问存储在模型中的值,从而节省到数据库的额外往返行程。