django用m2m_changed信号检测灯具

Mei*_*ham 5 python django signals m2m

我很难弄清楚在夹具加载期间是否调用了信号处理程序。raw当django加载夹具时,我的大多数信号处理程序都会收到一个额外的关键字。但是,此额外的关键字仅在处理“前/后”信号时通过,如果我正在收听的信号为m2m_changed,则不会通过。

有没有可靠的方法来告诉我是否处于“灯具加载模式” m2m_changed

Bel*_*zar 0

好吧,如果有人像我一样发现这个问题,解决这个问题的一种非常非常可怕的方法如下:

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)