21

假设您想为您创建的应用程序的重大更改设置一个测试环境,并且您想确保系统中存在的这些数据能够轻松加载到新系统中。

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

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

该文档确定(尽管没有明确)在此过程中忽略了某些信号:

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

有没有办法post_save在这个过程中禁用信号调用loaddata

可能相关:

4

1 回答 1

40

实现此目的的一种方法是添加一个装饰器,该装饰器在将信号分派到接收器函数时查找原始关键字参数。这在 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

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

于 2013-03-25T21:28:57.040 回答