忽略或禁用post_save信号的loaddata方法

25

假设你想为自己创建的应用程序设置一个测试环境,以进行重大更改,并且你想确保系统中的数据能够轻松地加载到新系统中。

Django提供了命令行工具来导出和加载数据。通过dumpdataloaddata实现。

python manage.py dumpdata app.Model > Model.json
python manage.py loaddata Model.json
文档指出(尽管没有明确说明),在此过程中将忽略某些信号:
处理装置文件时,数据会按原样保存到数据库中。不会调用模型定义的保存方法和pre_save信号。(来源
是否有一种方法可以在loaddata过程中禁用post_save信号调用?可能相关:

1个回答

49

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


那么这将作为函数或post_save.connect()的装饰器,对吗? - Brandon Bertelsen
2
@BrandonBertelsen 因为它是一个函数装饰器,所以应该加在函数上。 - saul.shanabrook
仍然适用于Django 1.8(尽管我已经删除了functools依赖) - GergelyPolonkai
1
我可以建议使用以下代码以防止自定义信号未传递 'raw' 关键字参数时出现 KeyError 错误: if 'raw' in kwargs and kwargs['raw']: - Chris Del Guercio
@ChrisDelGuercio- 感谢您的建议。我已经更新了回复。 - garnertb
2023年,工作进行中。你有ko-fi账户吗?我很愿意请你喝杯咖啡。 - dani herrera

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接