【问题标题】:Django m2m_changed signal is never called从未调用 Django m2m_changed 信号
【发布时间】:2018-11-10 12:50:23
【问题描述】:

我不明白为什么我的 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.pythis 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)>)]

【问题讨论】:

  • from django.db.models.signals import m2m_changed 并发布(在您的问题中)这给了您什么:m2m_changed.receivers(如果它不是一个空列表,在这种情况下信号未连接)。跨度>
  • @CoffeeBasedLifeform 这是一个空列表!
  • 尝试将m2m_changed.connect(my_callback)添加到signals.py的末尾并再次检查m2m_changed.receivers。 (可能必须从您的回调中删除接收器装饰器)。
  • 列表还是空的:(
  • 尝试在您的应用程序的__init__.py 中导入badges.signals,如下所述:click。 (settings.py 文件夹中的 init.py 或您的应用程序的主文件夹应该可以工作)

标签: python django django-signals


【解决方案1】:

我在 Django 文档的this section 中发现了我的错误。 从一开始,我的应用配置就没有被调用过!

其实,要正确注册一个应用,我有两种方法:

方法一

INSTALLED_APPS = ['badges', ...]

并在__init__.py 中声明:default_app_config = 'badges.apps.BadgesConfig'

方法二

INSTALLED_APPS = ['badges.apps.BadgesConfig']

我的错误

我使用INSTALLED_APPS = ['badges', ...] 没有在__init__.py 中声明任何内容

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

【讨论】:

    猜你喜欢
    • 2011-09-21
    • 2013-05-10
    • 2013-09-05
    • 2020-07-15
    • 1970-01-01
    • 2019-10-17
    • 2012-09-23
    • 2012-07-26
    • 1970-01-01
    相关资源
    最近更新 更多