Какой бы маршрут вы ни выбрали, он окажется хакерским - гарантирую.
Тем не менее, я думаю, что вы на правильном пути. Хранение настроек в базе данных кажется плохой идеей, потому что настройки соединения с базой данных находятся в самом файле settings.py, что может привести к серьезным проблемам.
Ваша идея использовать JSON и хранить данные в виде файла на диске, вероятно, является лучшим методом, потому что, как еще они будут храниться, если бы не база данных?
Моя единственная реакция на то, как вы пытались добиться этого, заключалась в том, что кажется, что было бы действительно нехорошо вручную кодировать все строки, подобные этой EMAIL_HOST = EMAIL_DEVELOPMENT['email_host']
. Было бы проще просто проверить, существует ли это значение в локальных настройках JSON и вернуть его автоматически.
Вот немного хакерского и непроверенного концептуального кода. Скопируйте settings.py в settings_default.py, и он станет новым settings.py:
settings.py
from local_settings import EMAIL_DEVELOPMENT
import settings_default as defaults
import sys
class DynamicSettings(object):
def __getattr__(self, key):
if hasattr(EMAIL_DEVELOPMENT, key):
return getattr(EMAIL_DEVELOPMENT, key.lower())
else:
return getattr(defaults, key)
sys.modules[__name__] = DynamicSettings()