3

在 Django 项目中,我的目录结构如下所示:

project/
├╴module_name/
│ ├╴dbrouters.py
│ ...
...

dbrouters.py中,我定义了一个这样开始的类:

class CustomDBRouter(object):
  current_connection = 'default'
  ...

这个想法是有一个数据库路由器,它设置在每个请求开始时使用的连接,然后将该连接用于所有后续数据库查询,类似于Django 文档中描述的自动数据库路由

一切都很好,除了当我想CustomDBRouter在脚本中导入时,我必须使用绝对路径,否则会发生一些奇怪的事情

假设在应用程序的一部分中发生了CustomDBRouter.current_connection更改:

import project.module_name.dbrouters.CustomDBRouter
...
CustomDBRouter.current_connection = 'alternate'

在应用程序的另一部分(假设它在上述代码之后执行),我使用相对导入来代替:

import .dbrouters.CustomDBRouter
...
print CustomDBRouter.current_connection # Outputs 'default', not 'alternate'!

我很困惑为什么会这样。CustomDBRouterPython 是否因为我使用了不同的导入路径而创建了一个新的类对象?

加分项:有没有更好的方法来实现“全局”类属性?

4

2 回答 2

0

这取决于此脚本的执行方式。当您使用相对导入时,您必须确保导入所在脚本的名称具有__name____main__. 如果是,import .dbrouters.CustomDBRouter则变为import __main__.dbrouters.CustomDBRouter

我在这里找到了这个。

于 2013-07-26T20:42:57.490 回答
0

事实证明,问题是由另一个文件中的几行引起的:

PROJECT_ROOT = '/path/to/project'
sys.path.insert(0, '%s' % PROJECT_ROOT)
sys.path.insert(1, '%s/module_name' % PROJECT_ROOT)

引用的文件是.dbrouters使用“快捷方式”路径(例如,import views而不是import module_name.views)导入的。

于 2013-09-13T22:57:26.560 回答