Django 让loaddata忽略或禁用post_保存信号

Django 让loaddata忽略或禁用post_保存信号,django,django-signals,Django,Django Signals,假设您希望为已创建的应用程序的重大更改设置一个测试环境,并希望确保系统中现有的数据能够轻松加载到新系统中 Django提供用于导出和加载数据的命令行工具。通过dumpdata和loaddata python manage.py dumpdata app.Model > Model.json python manage.py loaddata Model.json 文档中指出(尽管没有明确说明)在此过程中忽略了一些信号: 处理夹具文件时,数据将按原样保存到数据库中。不调用模型定义的保存方法

假设您希望为已创建的应用程序的重大更改设置一个测试环境,并希望确保系统中现有的数据能够轻松加载到新系统中

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

python manage.py dumpdata app.Model > Model.json
python manage.py loaddata Model.json
文档中指出(尽管没有明确说明)在此过程中忽略了一些信号:

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

loaddata
过程中,是否有方法禁用
post\u save
信号调用

可能相关:


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

因此,这将充当函数的装饰器,或者作为函数的post_save.connect()?@BrandonBertelsen的装饰器,因为它是一个函数装饰器。在Django 1.8中仍然有效(尽管我已经删除了
functools
依赖项),我是否可以建议
如果在kwargs和kwargs['raw'中使用'raw']:
防止自定义信号未通过“原始”时出现按键错误kwarg@ChrisDelGuercio-谢谢你的意见。我已经更新了回复。可能是重复的