首页 > 解决方案 > 在所有 Django 应用程序启动后如何调用函数

问题描述

我想加载一些我放在一个模块中的类,这些类不属于settings.INSTALLED_APPS列表的一部分。(我希望我的客户能够编写他们自己的子类,这些子类可以动态加载或重新加载。)我有一个调用函数load_classes()来执行此操作。问题是当我的项目最初开始时在哪里调用它。

我对此的第一次尝试是根据这个问题load_classes放置在ready()函数中,但显然只有在完成加载的特定应用程序之后才会调用,而不是全部。由于这些类定义从项目中的其他应用程序导入模型和函数,我最终得到了这个错误:AppConfigAppConfig

File "/Users/dylan/.local/share/virtualenvs/pipeproj-oDyHbVBN/lib/python3.8/site-packages/django/apps/registry.py", line 135, in check_apps_ready
raise AppRegistryNotReady("Apps aren't loaded yet.")
django.core.exceptions.AppRegistryNotReady: Apps aren't loaded yet.

我在哪里可以放置我的导入代码,以便在加载所有 Django 应用程序后触发它?

标签: pythonpython-3.xdjango

解决方案


Willem Van Onsem 的评论促使我查看apps.py我调用该ready函数的整个文件。虽然我使用的是动态加载,但我在文件顶部importlib.import_module有另一个完全独立的文件,它利用了其他应用程序。import一旦我把它拿出来,我就克服了错误。

AppConfig.ready所以教训是,在调用中包含对其他应用程序的所有依赖项。谢谢,威廉!


推荐阅读