loaddata忽略或禁用post_save信号

Bra*_*sen 12 django django-signals

假设您要为您创建的应用程序的主要更改设置测试环境,并且您希望确保系统中存在的那些数据可以轻松加载到新系统中.

Django提供用于导出和加载数据的命令行工具.通过dumpdataloaddata

python manage.py dumpdata app.Model > Model.json
python manage.py loaddata Model.json
Run Code Online (Sandbox Code Playgroud)

该文档标识(尽管未明确)在此过程中忽略某些信号:

处理夹具文件时,数据将按原样保存到数据库中.不调用模型定义的保存方法和pre_save信号.(来源)

有没有办法post_save在此loaddata过程中禁用信号调用?

可能相关:

gar*_*rtb 30

实现此目的的一种方法是添加一个装饰器,在将信号分派给接收器函数时查找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
Run Code Online (Sandbox Code Playgroud)

然后:

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

根据文档,raw关键字为:如果模型完全按照所呈现的方式保存(即加载夹具时),则为True.

  • @BrandonBertelsen 对于函数,因为它是一个函数装饰器。 (2认同)