Как мне убедиться, что моя Django модель синглтона существует при запуске? - PullRequest
0 голосов
/ 12 января 2020

Я использую django стороннее приложение под названием django -solo , чтобы дать мне SingletonModel, который я могу использовать для некоторых глобальных настроек проекта, так как мне не нужно несколько объектов для Представьте эти настройки.

Это прекрасно работает, но в базе данных fre sh мне нужно go войти и создать экземпляр этой модели, иначе она не будет отображаться в Django Admin .

Как заставить django автоматически убедиться, что при запуске django, когда он подключается к базе данных, он создает это?

Я пытался использовать следующий код, который Я получил здесь в моем settings_app/apps.py, но, похоже, он не срабатывает ни в какой момент:

from django.db.backends.signals import connection_created

def init_my_app(sender, connection, **kwargs):
   from .models import MyGlobalSettings

   # This creates an instance of MyGlobalSettings if it doesn't exist
   MyGlobalSettings.get_solo()

   print("Instance of MyGlobalSettings created...")

class SettingsAppConfig(AppConfig):
    ...
    def ready(self):
        connection_created.connect(init_my_app, sender=self)

Экземпляр не создан, и я не вижу своего распечатать заявление в журналах. Я что-то не так делаю?

В примере кода также есть кое-что об использовании post_migrate, но мне не нужен специальный код для запуска после миграции, поэтому я не уверен, что мне это нужно .

Обновление:

Мой INSTALLED_APPS выглядит следующим образом:

INSTALLED_APPS = [
    ...
    'settings_app.apps.SettingsAppConfig',
    'solo',  # This is for django-solo
]

Также обратите внимание, что метод ready () работает. Если я добавлю к нему оператор печати, я увижу его в журналах. Это просто моя функция init_my_app (), которая не запускается.

1 Ответ

0 голосов
/ 12 января 2020

Я думаю, что вполне вероятно, что соединение с базой данных инициализируется до запуска метода ready() вашего приложения - поэтому подключение к сигналу в этот момент слишком поздно.

В любом случае вам не нужно подключаться к сигналу - просто выполните проверку непосредственно в методе ready():

def ready(self):
    from .models import MyGlobalSettings
    MyGlobalSettings.get_solo()

Обратите внимание, что могут возникнуть другие проблемы здесь - например, вы получите сообщение об ошибке, если миграции для модели MyGlobalSettings еще не применены к базе данных (например, при первом запуске manage.py migrate) - вам, вероятно, потребуется перехватить указанный c исключения из базы данных и пропустить создание этого объекта в таких случаях.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...