You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.18 16:05:25