Django初始化时阻止DB调用



在Django中,出于充分的原因,不鼓励在例如models.py中从模块级别运行查询。

  1. 由于这意味着您的查询是在初始化时运行的,因此在运行查询时,DB机器的状态基本上是未知的
  2. 它使测试变得困难/不可能(原因为"1")
  3. 它会减慢加载应用程序的速度
  4. 加载时发生的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-信号),因此此代码对程序的其余部分没有任何影响。

希望这能有所帮助!

最新更新