Django обнаруживает приборы с помощью сигналов m2m_changed

У меня проблемы с выяснением, вызывается ли мой обработчик сигнала во время загрузки прибора или нет. Большинство моих обработчиков сигналов получают дополнительное ключевое слово raw когда Django грузит светильники. Однако, это дополнительное ключевое слово пропускается только при обработке сигналов "pre/post", оно не проходит, если сигнал, который я слушаю, является m2m_changed!

Есть ли надежный способ узнать, нахожусь ли я в "режиме загрузки прибора" или нет m2m_changed

1 ответ

Что ж, если кто-то нашел это так же, как я, один ужасный, ужасный способ решить эту проблему заключается в следующем:

https://code.djangoproject.com/ticket/8399#comment:7

В этом старом билете проекта django запрошен способ определить, был ли запущен сигнал из loaddata или нет.

После этого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

Затем вы можете использовать этот декоратор, чтобы отключить любой сигнал в 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
Другие вопросы по тегам