循环导入导致应用启动失败:分层与延迟导入
现象
启动时报 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