django改变一个应用程序的设置

时间:2013-07-17 14:09:12

标签: django django-settings

好吧,我有一个django项目,现在工作正常。

我想在其中添加一个新应用,我需要访问多个数据库。

我知道Django支持多种数据库设置并知道如何配置它。这不是问题。

问题在于,在90%的项目组件中,我不需要维护多个数据库设置。第二个数据库的唯一用途是在新添加的应用程序中。

所以我试着通过调用:

来改变设置
django.conf.settings.configure(DATABASES = {....})

在新应用中。而django说:

RuntimeError: Settings already configured.

这是有道理的,因为我有原始设置文件并设置了DJANGO_SETTINGS_MODULE。

所以我怀疑在这种情况下应该是一个好方法。

  1. 我不想丢弃DJANGO_SETTINGS_MODULE变量。
  2. 我最初尝试不在设置文件中包含第二个数据库,因为新的应用程序也是一个独立的模块,应该在django项目之外独立工作。所以我想在新应用程序中使用类似的配置来设置数据库配置。
  3. 有没有人对此有任何想法?

    提前致谢!

1 个答案:

答案 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',
   }
 }