Подтвердить что ты не робот

Если loaddata игнорирует или отключает сигналы post_save

Предположим, что вы хотите настроить тестовую среду для основных изменений в создаваемом приложении и хотите, чтобы те данные, которые были в вашей системе, легко загружались в новую систему.

Django предоставляет средства командной строки для экспорта и загрузки данных. Через dumpdata и loaddata

python manage.py dumpdata app.Model > Model.json
python manage.py loaddata Model.json

Документация идентифицирует (хотя и не явно), что некоторые сигналы игнорируются во время этого процесса:

Когда файлы архивации обрабатываются, данные сохраняются в базе данных как есть. Определенные моделью методы сохранения и сигналы pre_save не вызываются. (источник)

Есть ли способ отключить сигнальные вызовы post_save во время процесса loaddata?

Возможно Связано:

4b9b3361

Ответ 1

Одним из способов достижения этого является добавление декоратора, который ищет аргумент raw ключевого слова, когда сигнал отправляется в вашу функцию приемника. Это хорошо сработало для меня на Django 1.4.3, я не тестировал его на 1.5, но он все равно должен работать.

from functools import wraps
def disable_for_loaddata(signal_handler):
    """
    Decorator that turns off signal handlers when loading fixture data.
    """

    @wraps(signal_handler)
    def wrapper(*args, **kwargs):
        if kwargs.get('raw'):
            return
        signal_handler(*args, **kwargs)
    return wrapper

Тогда:

@disable_for_loaddata
def your_fun(**kwargs):
    ## stuff that won't happen if the signal is initiated by loaddata process

В документах ключевое слово raw: True, если модель сохраняется точно в том виде, в каком она была представлена ​​(т.е. при загрузке прибора).