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