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

如何让Django中的signals.py生效?配置后无效求助

问题:Django M2M信号未触发排查

在Ubuntu22.04/WSL2(Windows11)环境下,使用Django4.1.1/Python3.10运行以下信号代码时,VSCode提示信号未被使用,Django Debug Toolbar也确认信号未触发。已配置apps.py、init.py、settings.py,但问题依旧,求排查提示。

signals.py代码

from .models import Sale
from django.db.models.signals import m2m_changed
from django.dispatch import receiver


@receiver(m2m_changed, sender=Sale.positions.through)
def calculate_total_price(sender, instance, action, **kwargs):
    print('action', action)

    total_price = 0
    if action == 'post_add' or action == 'post_remove':
        for item in instance.get_positions():
            total_price += item.price
    
    instance.total_price = total_price
    instance.save()

apps.py代码

from django.apps import AppConfig


class SalesConfig(AppConfig):
    #default_auto_field = 'django.db.models.BigAutoField'
    name = 'sales'

def ready(self):
    import sales.signals

init.py代码

default_app_config = 'sales.apps.SalesConfig'

settings.py关键配置片段

INSTALLED_APPS = [
    "django.contrib.admin",
    "django.contrib.auth",
    "django.contrib.contenttypes",
    "django.contrib.sessions",
    "django.contrib.messages",
    "django.contrib.staticfiles",
    "debug_toolbar",
    # my apps
    "customers",
    "products",
    "profiles",
    "reports",
    "sales.apps.SalesConfig",
    # 3rd party
    "crispy_forms",
]

# 其他配置略...

排查提示

  • 修复apps.py的缩进错误:当前ready方法定义在SalesConfig类外部,Django不会调用这个独立函数。必须把ready方法缩进至类内部:
    class SalesConfig(AppConfig):
        #default_auto_field = 'django.db.models.BigAutoField'
        name = 'sales'
    
        def ready(self):
            import sales.signals
    
  • 重启Django开发服务器:Django仅在启动时加载AppConfig的ready方法,修改配置后必须重启服务才能生效。
  • 验证信号模块是否被加载:在signals.py开头添加print("Sales signals loaded successfully!"),启动服务器时查看控制台是否输出该信息,确认信号模块已被导入。
  • 检查M2M字段与关联方法:确保Sale模型中的positions是正确定义的ManyToManyField,且get_positions()方法能正确返回所有关联的position条目。
  • 确认信号触发场景:该信号仅在M2M关系的post_add或post_remove操作后触发,直接修改单个position的price不会触发此信号,需通过添加/删除关联条目来测试。
  • 检查INSTALLED_APPS配置:确保未重复添加sales应用(当前配置无误),避免AppConfig加载冲突。

内容的提问来源于stack exchange,提问作者sloth

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.19 19:05:25