Django初始化时阻止DB调用

时间:2015-02-13 11:39:32

标签: django django-models

在Django中,从模块级别运行查询,例如劝阻models.py是有充分理由的。

  1. 由于这意味着您的查询在初始化时运行,因此在查询运行时,您的数据库机器的状态基本上是未知的。
  2. 它使测试变得困难/不可能(因为'1')。
  3. 减慢加载您的应用程序
  4. 负载发生的DB(连接或其他)错误将“永远记住”
  5. 不幸的是,我不清楚如何一般地阻止它,这意味着Murphey定律会发生它。

    说我有类似下面的东西(但是对于违规函数的名称稍微不那么明显)...我怎样才能防止这种情况(即难以理解)?

    # models.py
    
    class MyModel(models.Model):
        somefield = models.IntegerField(choices=get_something_from_db())
    

    请注意,即使您使用Django 1.8的可调用选项,也始终执行上述操作,所有选项都会进行模型验证评估。

1 个答案:

答案 0 :(得分:0)

我自己没有尝试过,但你可以用几个信号做到这一点。

首先,您可以通过侦听连接创建的信号来阻止数据库连接:

https://docs.djangoproject.com/en/1.8/ref/signals/#connection-created

通过收听此信号(https://docs.djangoproject.com/en/1.8/topics/signals/#listening-to-signals) 您可以引发异常以防止您的代码实际执行任何操作。

其次,您可以通过收听请求启动信号来判断您是否收到了请求: https://docs.djangoproject.com/en/1.8/ref/signals/#request-started

在此信号的接收器上,您可以删除“连接创建”信号的侦听器,以便现在可以创建数据库连接。 最后一步,将侦听器移除到“请求已启动”信号(https://docs.djangoproject.com/en/1.8/topics/signals/#disconnecting-signals),这样您就不会对此代码的其余部分产生任何影响。

希望这有帮助!