假设您要设置一个测试环境,以便对您创建的应用程序进行重大更改,并且您希望确保系统中存在的那些数据可以轻松加载到新系统中。
Django提供用于导出和加载数据的命令行工具。通过dumpdata
和loaddata
python manage.py dumpdata app.Model > Model.json
python manage.py loaddata Model.json
文档标识(虽然没有明确说明)在此过程中忽略了某些信号:
处理夹具文件时,数据将按原样保存到数据库中。不调用模型定义的保存方法和pre_save信号。 (source)
有没有办法在post_save
进程中禁用loaddata
信号呼叫?
可能相关:
答案 0 :(得分:29)
实现此目的的一种方法是添加一个装饰器,当信号被分派到接收器函数时,该装饰器会查找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
然后:
@disable_for_loaddata
def your_fun(**kwargs):
## stuff that won't happen if the signal is initiated by loaddata process
根据文档,raw关键字为:如果模型完全按照所呈现的方式保存(即加载夹具时),则为True。