Have loaddata ignore or disable post_save signals

有些话、适合烂在心里 提交于 2019-12-31 20:34:30

问题


Let's say that you want to setup a test environment for major changes to an application that you have created, and you want to make sure that those data existing in your system will easily load into the new system.

Django provides command line facilities for exporting and loading data. Via dumpdata and loaddata

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

The documentation, identifies (although not explicitly) that some signals are ignored during this process:

When fixture files are processed, the data is saved to the database as is. Model defined save methods and pre_save signals are not called. (source)

Is there a way to disable post_save signal calls during the loaddata process?

Possibly Related:

  • How do I prevent fixtures from conflicting with django post_save signal code?
  • https://code.djangoproject.com/ticket/8399

回答1:


One way to achieve this is to add a decorator that looks for the raw keyword argument when the signal is dispatched to your receiver function. This has worked well for me on Django 1.4.3, I haven't tested it on 1.5 but it should still work.

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

Then:

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

Per the docs, the raw keyword is: True if the model is saved exactly as presented (i.e. when loading a fixture).



来源:https://stackoverflow.com/questions/15624817/have-loaddata-ignore-or-disable-post-save-signals

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!