Django - предупреждение «Доступ к базе данных во время инициализации приложения не рекомендуется» в AppConfig.ready() поPython

Программы на Python
Ответить
Anonymous
 Django - предупреждение «Доступ к базе данных во время инициализации приложения не рекомендуется» в AppConfig.ready() по

Сообщение Anonymous »

Недавно я обновил Django до последней версии, 5.1.2, и с тех пор каждый раз, когда я запускаю сервер, я получаю это предупреждение:

RuntimeWarning: доступ к базе данных во время инициализации приложения не рекомендуется. Чтобы устранить это предупреждение, избегайте выполнения запросов в AppConfig.ready() или при импорте модулей вашего приложения.

Из того, что я искал до сих пор, мой файл apps.py вызывает это из-за операции, которую он выполняет с базой данных:

Код: Выделить всё

from django.apps import AppConfig

class TenantsConfig(AppConfig):
default_auto_field = 'django.db.models.BigAutoField'
name = 'tenants'

def ready(self):
self.load_additional_databases()

def load_additional_databases(self):
from django.conf import settings

from .models import DatabaseConfig

for config in DatabaseConfig.objects.all():
if config.name not in settings.DATABASES:

db_settings = settings.DATABASES['default'].copy()

db_settings.update({
'ENGINE': config.engine,
'NAME': config.database_name,
'USER': config.user,
'PASSWORD': config.password,
'HOST': config.host,
'PORT': config.port,
})

settings.DATABASES[config.name] = db_settings
В моем settings.py жестко закодированы две основные базы данных (по умолчанию и арендаторы), а остальные конфигурации должны обновляться данными из модели DatabaseConfig. когда я запускаю сервер. Проблема в том, что мне нужно именно такое поведение, но решение, которое я нашел на данный момент, заключается в использовании Connection_created, которое запускает это для каждого запроса к базе данных. Это реализация с использованием сигнала:

Код: Выделить всё

def db_config(**kwargs):
from django.conf import settings

from .models import DatabaseConfig

for config in DatabaseConfig.objects.all():
if config.name not in settings.DATABASES:

db_settings = settings.DATABASES['default'].copy()

db_settings.update({
'ENGINE': config.engine,
'NAME': config.database_name,
'USER': config.user,
'PASSWORD': config.password,
'HOST': config.host,
'PORT': config.port,
})

settings.DATABASES[config.name] = db_settings

class TenantsConfig(AppConfig):
default_auto_field = 'django.db.models.BigAutoField'
name = 'tenants'

def ready(self):
connection_created.connect(db_config)
Есть ли другой способ добиться предыдущего поведения в готовом методе? Или действительно так плохо продолжать использовать его с предупреждением? Насколько я понимаю из документации, этого следует избегать, но это не обязательно плохо. В документации упоминаются методы save() и delete(), но здесь я просто обновляю файл settings.py. Любая помощь будет оценена по достоинству.

Подробнее здесь: https://stackoverflow.com/questions/791 ... discourage
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Python»