Обратите внимание, что вы не можете надежно подключиться к базе данных или взаимодействовать с моделями внутри функции AppConfig.ready
(см. предупреждение в документации).
Если вам нужно взаимодействовать с базой данных в вашем коде запуска, можно использовать сигнал connection_created
для выполнения кода инициализации при подключении к базе данных.
from django.dispatch import receiver
from django.db.backends.signals import connection_created
@receiver(connection_created)
def my_receiver(connection, **kwargs):
with connection.cursor() as cursor:
# do something to the database
Очевидно, что это решение предназначено для запуска кода один раз на соединение с базой данных, а не один раз на начало проекта. Таким образом, вам нужно разумное значение для параметра CONN_MAX_AGE
, чтобы не повторять код инициализации при каждом запросе. Также обратите внимание, что сервер разработки игнорирует CONN_MAX_AGE
, поэтому вы будете запускать код один раз для каждого запроса в разработке.
99% случаев это плохая идея - код инициализации базы данных должен идти в процессе миграции - но есть некоторые случаи использования, когда вы не можете избежать поздней инициализации, и приведенные выше предостережения приемлемы.