在Django项目中,我有一个看起来像这样的目录结构:
project/
├╴module_name/
│ ├╴dbrouters.py
│ ...
...
在dbrouters.py
中,我定义了一个类似这样的类:
class CustomDBRouter(object):
current_connection = 'default'
...
我们的想法是建立一个数据库路由器,设置在每个请求开始时使用的连接,然后将该连接用于所有后续数据库查询,类似于Django docs for automatic database routing中描述的内容。
一切都很好,除非我想在脚本中导入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'!
我很困惑为什么会这样。 Python是否为CustomDBRouter
创建了一个新的类对象,因为我使用的是不同的导入路径?
奖励积分:有没有更好的方法来实现'全球'类属性?
答案 0 :(得分:0)
这取决于此脚本的执行方式。当您使用相对导入时,您必须确保导入所使用的脚本的名称具有__name__
以外的__main__
属性。如果是,import .dbrouters.CustomDBRouter
变为import __main__.dbrouters.CustomDBRouter
。
我发现了here。
答案 1 :(得分: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
)。