Django信号接收器sender失效:post_save触发非目标模型事件
问题原因
你现在的代码重复注册了信号处理器,导致出现非目标模型触发的情况:
signals.py里的@receiver(post_save, sender=Client)已经自动帮你注册了只监听Client模型的信号;- 但
apps.py里又手动调用了post_save.connect(signals.write_svg, ...),这次调用没有指定sender参数,相当于给所有模型的post_save事件都绑定了这个处理器,自然会触发Session这类无关模型的日志。
解决方法
二选一即可:
方法1:移除手动连接的代码
直接删掉apps.py里的手动连接行,保留@receiver的自动注册:
修改后的apps.py:
from django.db.models.signals import post_save class ClientsConfig(AppConfig): name = 'clients' verbose_name = "clients" def ready(self): """https://docs.djangoproject.com/en/4.1/topics/signals/""" # Implicitly connect signal handlers decorated with @receiver. from . import signals # 删掉下面这行手动连接的代码 # post_save.connect(signals.write_svg, dispatch_uid="clients_client_post_save")
方法2:手动连接时指定sender
如果一定要保留手动连接,必须加上sender=Client参数,确保只监听目标模型:
修改后的apps.py:
from django.db.models.signals import post_save from .models import Client # 记得导入Client模型 class ClientsConfig(AppConfig): name = 'clients' verbose_name = "clients" def ready(self): """https://docs.djangoproject.com/en/4.1/topics/signals/""" # Implicitly connect signal handlers decorated with @receiver. from . import signals # 手动连接时指定sender post_save.connect(signals.write_svg, sender=Client, dispatch_uid="clients_client_post_save")
同时注意:如果用这种方法,建议把signals.py里的@receiver装饰器删掉,避免再次重复注册。
验证
修改后重新运行,信号就只会在Client模型保存时触发,不会再出现Session等无关模型的日志了。
内容的提问来源于stack exchange,提问作者run_the_race
相关产品推荐
相关产品推荐

