DJANGO: Выполнение SQL-запроса с использованием курсора в файле project.settings.py
В моем проекте я сделал некоторые поля настроек в файле "settings.py" настраиваемыми, открыв их пользователю через файл окружения. Пользователь может изменять значения в .env-файле, которые затем используются для обновления полей настроек в основном файле settings.py проекта. Я хочу улучшить это, перенеся некоторые из этих значений в базу данных, чтобы пользователи могли устанавливать свои значения интерактивно через пользовательский интерфейс продукта вместо того, чтобы изменять .env. Я использовал следующий подход:
- После объявления базы данных по умолчанию в словаре DATABASES я создаю курсор
connection.cursor()для выполнения необработанного SQL-запроса, который извлекает настройки из базы данных, как описано в документации. - Я манипулирую результатами курсора для создания словаря, в котором ключами являются идентификаторы настроек, а значениями - соответствующие значения из базы данных, установленные пользователем.
- Затем этот словарь используется для присвоения соответствующего значения каждой переменной настройки Django (т.е.
SESSION_COOKIE_AGE,MEDIA_ROOTи т.д.). Поэтому для каждой переменной настройки вместо того, чтобы делатьgetenv, я извлекаю значение из словаря, используя соответствующий ключ.
Я наблюдал за поведением кода в settings.py, и я вижу, что каждое значение настройки присваивается правильной переменной, идентично тому, как это было при использовании предыдущего подхода .env. Проблема в том, что когда к этим переменным настройки обращаются в коде через django.conf.settings или путем прямого импорта (from project.settings import SETTING), их значением является пустая строка, как будто они не были объявлены в первую очередь.
Я заметил, что настройки, объявленные до инстанцирования курсора (независимо от того, было ли их значение жестко закодировано или получено из .env), работают нормально. Настройки после курсора, похоже, не сохраняют свое состояние вне файла settings.py.
Может ли кто-нибудь просветить меня, почему использование курсора в файле settings.py делает недействительными все поля настроек, объявленные после него?
Мне удалось решить эту проблему. Проблема заключалась в том, что я использовал модель Django connection (from django.db import connection), которая выполняет SQL запрос к базе данных по умолчанию. Поскольку она выполнялась в settings.py, когда проект еще находился в процессе настройки, это вызвало странное поведение, описанное выше
Решение: Вместо того чтобы использовать django.db.connection (модель Django) для выполнения запроса, я использовал библиотеку Python pyodbc, которая является движком базы данных, используемым в проекте. С помощью pyodbc я смог установить соединение с базой данных и выполнить свой запрос (как описано здесь ) независимо от состояния Django.