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



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

这很好用,但是在一个新的数据库中,我需要进入并创建此模型的实例,否则它不会显示在 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)

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

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

更新:

我的INSTALLED_APPS如下所示:

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

另请注意,ready(( 方法确实运行。如果我向其添加打印语句,我确实会在日志中看到它。这只是我的 init_my_app(( 函数没有运行。

我认为数据库连接很可能在应用程序的ready()方法运行之前就已初始化 - 因此此时附加到信号为时已晚。

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

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

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

最新更新