好吧,我有一个django项目,现在工作正常。
我想在其中添加一个新应用,我需要访问多个数据库。
我知道Django支持多种数据库设置并知道如何配置它。这不是问题。
问题在于,在90%的项目组件中,我不需要维护多个数据库设置。第二个数据库的唯一用途是在新添加的应用程序中。
所以我试着通过调用:
来改变设置django.conf.settings.configure(DATABASES = {....})
在新应用中。而django说:
RuntimeError: Settings already configured.
这是有道理的,因为我有原始设置文件并设置了DJANGO_SETTINGS_MODULE。
所以我怀疑在这种情况下应该是一个好方法。
有没有人对此有任何想法?
提前致谢!
答案 0 :(得分:2)
实际上,我在当前项目中遇到了同样的问题。因为我有一个完全独立的应用程序,它使用另一个数据库,我可能有其他应用程序可能具有相同的行为。
我所做的是创建一个dir应用程序,我存储我的应用程序,然后在settings.py文件的末尾添加它:
DATABASE_ROUTERS = ['myproject.routers.MultiDBRouter']
import os
APPS_DIR = os.path.join(PROJECT_ROOT, 'apps')
for app_name in os.listdir(APPS_DIR):
print '\nLooking for settings in apps/%s :' % app_name
if os.path.exists(os.path.join(APPS_DIR, app_name, 'settings.py')):
print ' Settings file found...'
app = __import__('%s.settings' % app_name)
content = dir(app.settings)
if 'DATABASES' in content:
print ' Adding databases :'
for key, value in app.settings.DATABASES.iteritems():
if DATABASES.has_key(key):
print ' Can not add %s database config, because it already exists' % key
else:
DATABASES[key] = value
DATABASES[key]['APPS'] = [app_name]
print ' Added %s database config' % key
它将自动在所有apps / myapp /目录中查看settings.py文件。如果它在app / myapp / settings.py文件中找到新的DATABASES变量,它会将其他数据库配置添加到您的DATABASES变量(真实变量)。
我还创建了一个路由器,不必使用using命令(MultiDBRouter)。
然后我在所有应用程序中添加一个settings.py文件,该文件需要另一个数据库:
DATABASES = {
'db': {
'ENGINE': 'django.db.backends.mysql',
'NAME': 'database',
'USER': 'username',
'PASSWORD': 'mysecretpassword',
}
}