Django迁移中get_model()获取CourseClass模型无objects属性问题
原因说明
Django 迁移流程中通过apps.get_model()获取的是历史快照模型,对自定义管理器的处理遵循以下规则:
- 默认仅会保留模型定义中第一个声明的管理器,以及所有显式配置了
use_in_migrations = True的管理器 - 你定义的
CourseClass模型中,管理器的声明顺序为student_manager→teacher_manager→objects,排在首位的是student_manager,且objects未开启use_in_migrations配置,因此历史模型中没有生成objects属性 - 其他模型没有额外自定义管理器、或
objects是第一个声明的管理器,因此可以正常访问objects属性
解决方案
以下三种方案可根据场景选用:
- 方案1:直接使用历史模型已有的管理器查询,若你的
StudentManager没有额外过滤逻辑、返回结果和默认管理器一致,直接替换代码即可:
# 原代码:for course_class in CourseClass.objects.all(): for course_class in CourseClass.student_manager.all():
- 方案2:通过模型元数据调用默认管理器,无需修改现有模型定义即可兼容所有场景:
for course_class in CourseClass._meta.default_manager.all():
- 方案3:给
objects管理器显式开启迁移支持,修改CourseClass模型代码:
objects = models.Manager(use_in_migrations=True)
注意:修改后需要先执行
makemigrations生成新的模型迁移、执行migrate应用后,再运行你当前的更新数据迁移才会生效。
内容的提问来源于stack exchange,提问作者Linh Nguyen
相关产品推荐
相关产品推荐

