循环导入导致应用启动失败:分层与延迟导入

现象

启动时报 ImportError/AppRegistryNotReady: Apps aren't loaded yet. 或某模块找不到类。

成因

模型、信号、业务服务相互在模块顶层导入,形成循环;或在models.py顶部执行依赖 AppRegistry 的逻辑。

改造策略

拆分层次:models.py只放模型;业务逻辑放 services.py;信号放 signals.py 并在apps.py.ready() 中注册。

延迟导入:在函数内部再导入依赖,或使用django.apps.apps.get_model()

避免在模块顶层执行查询。

示例

apps.py

from django.apps import AppConfig

class OrdersConfig(AppConfig):
    name = "orders"
    def ready(self):
        from . import signals  # 避免 models 与 signals 顶层互相 import

这套分层方式来自我在 gplpal 项目中长期踩坑后的统一规范。

评论 0