Django m2m_changed 信号永远不会被调用
Django m2m_changed signal is never called
我不明白为什么我的 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( 建议更改此文件)
from django.apps import AppConfig
class BadgesConfig(AppConfig):
name = 'badges'
def ready(self):
import badges.signals
去shell时:
m2m_changed.receivers
returns一个空列表(不起作用,永远收不到信号)
我找到了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)>)]
我在 Django 的 this section 文档中发现了我的错误。
从一开始,我的应用程序配置就从未被调用过!
其实要正确注册一个app,我有两个方法:
方法一
INSTALLED_APPS = ['badges', ...]
并在 __init__.py
中声明:default_app_config = 'badges.apps.BadgesConfig'
方法二
INSTALLED_APPS = ['badges.apps.BadgesConfig']
我的错误
我在使用 INSTALLED_APPS = ['badges', ...]
时没有在 __init__.py
中声明任何内容
我认为当 Django 注意到 apps.py
在文件夹应用程序中但从未使用过时,它可能会显示警告。
我不明白为什么我的 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(
from django.apps import AppConfig
class BadgesConfig(AppConfig):
name = 'badges'
def ready(self):
import badges.signals
去shell时:
m2m_changed.receivers
returns一个空列表(不起作用,永远收不到信号)
我找到了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)>)]
我在 Django 的 this section 文档中发现了我的错误。 从一开始,我的应用程序配置就从未被调用过!
其实要正确注册一个app,我有两个方法:
方法一
INSTALLED_APPS = ['badges', ...]
并在 __init__.py
中声明:default_app_config = 'badges.apps.BadgesConfig'
方法二
INSTALLED_APPS = ['badges.apps.BadgesConfig']
我的错误
我在使用 INSTALLED_APPS = ['badges', ...]
时没有在 __init__.py
我认为当 Django 注意到 apps.py
在文件夹应用程序中但从未使用过时,它可能会显示警告。