Django执行migrate报错no such table: clientauth_tbltokentypes问题咨询
错误原因
CreateModel的managers配置项作用是注册模型自定义管理器,不能用于编写数据初始化代码,你的修改逻辑不符合Django迁移框架的设计规则。- 迁移文件执行过程中,
CreateModel操作运行完成后才会在数据库生成对应表,但你直接在CreateModel的配置中调用tbltokentypes(token_type = "Registration").save(),此时表还未创建,自然会触发找不到表的报错。 - 迁移流程中禁止直接导入业务层的模型类,否则会出现模型版本和迁移阶段不匹配、表未创建就调用模型方法等问题。
正确修改方案
你需要使用migrations.RunPython来完成建表后的初始数据写入,修改后的迁移文件内容如下:
from django.db import migrations, models def init_token_types(apps, schema_editor): # 迁移阶段必须用apps.get_model获取对应历史版本的模型,不能直接导入业务models tbltokentypes = apps.get_model('clientauth', 'tbltokentypes') # 写入初始数据 tbltokentypes.objects.create(token_type="Registration") class Migration(migrations.Migration): initial = True dependencies = [ ] operations = [ migrations.CreateModel( name='tbltokentypes', fields=[ ('token_type_id', models.AutoField(primary_key=True, serialize=False, verbose_name='token_type_id')), ('token_type', models.CharField(max_length=30)), ], # 移除此前错误添加的managers配置 ), # 新增RunPython操作,建表完成后自动执行初始化逻辑 migrations.RunPython(init_token_types) ]
注意事项
- 如果此前已经运行过错误的迁移,需要先删除数据库
django_migrations表中对应clientauth应用的0001迁移记录,再重新执行python manage.py migrate即可生效。 - 后续所有迁移阶段的数据操作都要通过
RunPython实现,不要直接在迁移配置项中编写业务逻辑。 - 迁移文件中不要直接导入你编写的
models.py内的模型,统一使用apps.get_model获取对应版本的模型实例。
内容的提问来源于stack exchange,提问作者Pankaj
相关产品推荐
相关产品推荐

