【发布时间】: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.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)>)]
【问题讨论】:
-
请
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