好吧,如果有人像我一样发现这个问题,解决这个问题的一种非常非常可怕的方法如下:
https://code.djangoproject.com/ticket/8399#comment:7
在 django 项目的这张旧票中,需要一种确定是否从加载数据触发信号的方法。
此后,raw关键字是建议的解决方案,该解决方案不会出现在m2m_changed信号中。在此之前,有以下建议的解决方法,该解决方法仍然有效:
try:
from functools import wraps
except ImportError:
from django.utils.functional import wraps
import inspect
def disable_for_loaddata(signal_handler):
@wraps(signal_handler)
def wrapper(*args, **kwargs):
for fr in inspect.stack():
if inspect.getmodulename(fr[1]) == 'loaddata':
return
signal_handler(*args, **kwargs)
return wrapper
Run Code Online (Sandbox Code Playgroud)
然后,您可以使用此装饰器禁用 loaddata 上的任何信号,如下所示:
from django.db.models.signals import m2m_changed
from django.dispatch import receiver
@receiver(m2m_changed, sender=models.Foo.bar.through)
@disable_for_loaddata
def some_signal(sender, instance: models.Foo, action: str, **kwargs):
# signal code
Run Code Online (Sandbox Code Playgroud)