在Django中,出于充分的原因,不鼓励在例如models.py
中从模块级别运行查询。
- 由于这意味着您的查询是在初始化时运行的,因此在运行查询时,DB机器的状态基本上是未知的
- 它使测试变得困难/不可能(原因为"1")
- 它会减慢加载应用程序的速度
- 加载时发生的DB(连接或其他)错误将被"永远记住"
不幸的是,我不清楚如何普遍防止它,这意味着根据墨菲定律,它会发生。
假设我有下面这样的东西(但有一个不太明显的名称,用于冒犯函数)。。。我怎样才能一般地防止这种情况发生(即发生故障)?
# models.py
class MyModel(models.Model):
somefield = models.IntegerField(choices=get_something_from_db())
请注意,上面的内容总是执行的,即使您使用Django 1.8的可调用选项,也会评估所有选项以进行模型验证。
我自己还没有尝试过,但你可能可以用几个信号来完成。
首先,您可以通过监听创建连接的信号来阻止DB连接:
https://docs.djangoproject.com/en/1.8/ref/signals/#connection-创建
通过听这个信号(https://docs.djangoproject.com/en/1.8/topics/signals/#listening-至信号)您可以引发一个异常来阻止您的代码实际执行任何操作。
其次,您可以通过收听请求启动信号来判断是否收到请求:https://docs.djangoproject.com/en/1.8/ref/signals/#request-启动
在该信号的接收器上,您可以移除"连接创建"信号的侦听器,因此现在可以创建数据库连接。最后一步,删除"请求启动"信号的侦听器(https://docs.djangoproject.com/en/1.8/topics/signals/#disconnecting-信号),因此此代码对程序的其余部分没有任何影响。
希望这能有所帮助!