如何确保我的Django singleton模型在启动时存在?

2024-10-03 19:26:37 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在使用一个名为django-solo的django第三方应用程序为我提供一个SingletonModel,我可以将其用于一些全局项目设置,因为我不需要多个对象来表示这些设置

这非常有效,但是在一个新的数据库上,我需要进去创建这个模型的一个实例,否则它就不会出现在Django Admin中

我怎样才能让django自动确保当django启动时,当它连接到数据库时,它会创建这个

我尝试使用我在settings_app/apps.py中得到的here代码,但它似乎在任何时候都不会启动:

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)

实例没有创建,并且我在日志中没有看到我的print语句。我做错什么了吗

示例代码也有一些关于使用post_migrate的内容,但是我不需要任何特殊的代码来在迁移后运行,所以我不确定我是否需要它

更新:

我安装的应用程序如下所示:

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

还要注意ready()方法确实在运行。如果我给它添加一个print语句,我会在日志中看到它。只是我的init_my_app()函数没有运行


Tags: appsdjango实例代码数据库app应用程序settings
1条回答
网友
1楼 · 发布于 2024-10-03 19:26:37

我认为数据库连接很可能是在应用程序的ready()方法运行之前初始化的,因此在该点附加到信号已经太晚了

无论如何,您不需要附加到那里的信号-只需直接在ready()方法中执行检查:

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

请注意,这里可能会遇到其他问题-例如,如果尚未在数据库上应用MyGlobalSettings模型的迁移(例如,第一次运行manage.py migrate),您可能需要捕获特定的数据库异常,并在这种情况下跳过此对象的创建,则会出现错误

相关问题 更多 >