Как изменить переменную DATABASES при включении local_settings.py из django settings.py - PullRequest
3 голосов
/ 09 апреля 2011

В верхней части settings.py у меня есть:

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.postgresql_psycopg2',
        'NAME': 'dbname',
        'USER': 'dbuser',
        'PASSWORD': 'pw'
        'HOST': '',
        'PORT': '',
    }
}

В нижней части у меня есть:

try:
    from local_settings import *
except ImportError:
    pass

В local_settings.py я хотел бы изменить Базы данных['default'] ['host'], определенный в файле settings.py.

Возможно ли это?Если так, то как?Я не хочу дублировать весь параметр DATABASES, я просто хочу настроить HOST (чтобы указать на другой сервер).

Ответы [ 4 ]

2 голосов
/ 09 апреля 2011

Используйте это в вашем settings.py.

try:
    from local_settings import *
    for k,v in _DATABASES:
        if k in DATABASES:
            DATABASES[k].update(v)
        else:
            DATABASES[k] = v
except ImportError:
    pass

С чем-то вроде этого в вашем local_settings.py.

_DATABASES = {"default":{"HOST":"new_host"}}

РЕДАКТИРОВАТЬ: Примечание. Я изменил свой код для комментария @ saverio о вложенных словарях.

0 голосов
/ 09 апреля 2011

Обычно я переворачиваю его, поэтому settings.py переопределяет local_settings.py from local_settings import * в верхней части settings.py.Обычно настройки БД основаны на расположении, то есть dev db для работы с dev, и действительно не добавляют настройки db в settings.py.На мой взгляд, settings.py должен определять настройки, которые требуются в каждом месте, где запущен проект, и не должен быть перезаписан подмножеством.

0 голосов
/ 09 апреля 2011

Вы можете использовать execfile() вместо импорта. Это дает вам доступ ко всему в области settings.py:

execfile(os.path.join(os.path.dirname(__file__), 'local_settings.py'))
0 голосов
/ 09 апреля 2011

Попробуйте это в local_settings.py:

import settings

settings.DATABASES['default']['HOST'] = 'my_host'

Надеюсь, это поможет!

...