Django使用djongo集成MongoDB报AppRegistryNotReady错误排查
错误定位
- 异常触发位置:
models.py文件顶层作用域编写的Order模型实例化、字段赋值、save()数据插入逻辑。 - 报错和djongo驱动、MongoDB集成没有直接关联,属于Django生命周期使用不规范导致的通用错误。
根本原因
Django启动时存在严格的加载顺序:
- 首先初始化全局应用注册表
AppRegistry - 逐次导入所有已注册应用的
models.py文件,收集、注册所有模型类 - 全部模型注册校验完成后,才会进入服务就绪状态,允许执行ORM数据库读写操作
你将数据插入逻辑写在models.py顶层时,Python导入该模块、还没完成模型类注册的阶段,就会提前执行save()数据库操作,此时ORM框架尚未完成初始化,直接抛出AppRegistryNotReady("Models aren't loaded yet.")异常。
修复方案
根据你的实际使用场景选对应方案即可:
- 如果是临时测试数据插入:移除
models.py顶层的插入代码,通过python manage.py shell启动Django交互环境,在shell内执行模型实例化、赋值、save()逻辑,shell启动时已经完成全部模型加载,不会触发该错误。 - 如果是服务启动时需要自动执行的初始化数据逻辑:将代码迁移到对应应用的
AppConfig.ready()钩子中,注意模型导入要放在方法内部,不要放在模块顶层,同时增加重复插入判断避免服务重启时重复写入数据,参考代码如下:
# 对应app下的apps.py文件 from django.apps import AppConfig class YourAppConfig(AppConfig): default_auto_field = "django.db.models.BigAutoField" name = "你的应用名称" def ready(self): # 模型导入写在方法内部,避免循环导入和提前加载 from .models import Order # 按业务唯一标识判断数据是否已存在,防止重复插入 if not Order.objects.filter(order_no="init_001").exists(): order = Order() order.order_no = "init_001" # 其余字段赋值逻辑 order.save()
- 如果是批量初始化基础数据:优先使用Django自带的fixtures数据导入机制,或者在数据迁移文件中通过
RunPython操作写入初始化逻辑,不要在模型、序列化器、视图文件的顶层作用域直接执行ORM增删改查操作。
内容的提问来源于stack exchange,提问作者Jayesh Maiyani
相关产品推荐
相关产品推荐

