Django新增gradingmodel后运行makemigrations报quiz_gradingmodel不存在错误
根因定位
从报错栈可以直接定位问题:Django运行所有管理命令(包括makemigrations)前,会先执行所有已注册App的ready()钩子方法。你在quiz/apps.py第16行的ready()方法中直接遍历了model_to_deploy这个QuerySet,触发了数据库查询,此时你已经清空了数据库,gradingmodel对应的表还未通过迁移生成,因此直接抛出不存在表的报错。
当你注释掉新增的gradingmodel后,ready()方法的查询逻辑不会涉及到不存在的表,因此makemigrations可以正常运行。
临时解决步骤
- 先注释掉
quiz/apps.py中ready()方法内所有涉及数据库读写的代码,包括本次触发报错的model_to_deploy遍历逻辑 - 执行
python manage.py makemigrations quiz生成gradingmodel对应的迁移文件 - 执行
python manage.py migrate完成迁移,在数据库中生成quiz_gradingmodel表 - 恢复之前注释的
ready()方法代码,后续执行Django管理命令就不会再触发该报错
长期优化方案
如果你的ready()方法必须保留数据库查询逻辑,可以增加表存在性判断,避免迁移执行前的初始化阶段报错:
from django.db import connections, OperationalError def ready(self): # 先校验目标表是否存在 try: table_list = connections['default'].introspection.table_names() except OperationalError: # 数据库未初始化的情况下直接跳过查询逻辑 return if 'quiz_gradingmodel' not in table_list: return # 以下放原有业务逻辑 for model in model_to_deploy: # 原有代码
内容的提问来源于stack exchange,提问作者IeatBread
相关产品推荐
相关产品推荐

