Django m2m_changed信号永远不会被调用

时间:2018-05-31 13:25:43

标签: python django django-signals

我无法理解为什么我的m2m_changed信号没有被触发。

以下是代码:

models.py

class Badge(TimeStampable, Expirable, Deactivable,
            SafeDeleteModel):
    _safedelete_policy = HARD_DELETE

    owner = models.ForeignKey(settings.AUTH_USER_MODEL,
                              blank=True, null=True,
                              on_delete=models.PROTECT)
    restaurants = models.ManyToManyField(Restaurant)
    identifier = models.CharField(max_length=2048)

    objects = SafeDeleteManager.from_queryset(BadgeQuerySet)()

signals.py

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

from .models import Badge

@receiver(m2m_changed, sender=Badge.restaurants.through)
def my_callback(sender, **kwargs):
    print("M2M has been changed!")

apps.py this post建议更改此文件)

from django.apps import AppConfig

class BadgesConfig(AppConfig):
    name = 'badges'

    def ready(self):
        import badges.signals

去shell时:

  • m2m_changed.receivers返回一个空列表(它不起作用,并且永远不会收到信号)

我找到similar post但未找到答案。

为什么m2m_changed信号不起作用?

修改

打开shell并导入badges.signals时,它可以正常工作。 这意味着问题出在apps.py:

In [1]: from django.db.models.signals import m2m_changed

In [2]: m2m_changed.receivers
Out[2]: []

In [3]: import badges.signals

In [4]: m2m_changed.receivers
Out[4]:
[((4551224720, 4520068792),
  <weakref at 0x10f4da5e8; to 'function' at 0x10f462d90 (check_uniqueness)>)]

1 个答案:

答案 0 :(得分:6)

我在Django的this section文件中发现了我的错误。 从开始,我的应用程序配置从未被调用过!

实际上,要正确注册应用程序,我有两种方法:

方法1

INSTALLED_APPS = ['badges', ...]

并在__init__.pydefault_app_config = 'badges.apps.BadgesConfig'

中声明

方法2

INSTALLED_APPS = ['badges.apps.BadgesConfig']

我的错误

我在使用INSTALLED_APPS = ['badges', ...]而没有在__init__.py

中声明任何内容

我想当Django注意到apps.py在文件夹应用程序中但从未使用过时,可能会显示警告。