Django迁移创建UserRelationship关联时报需User实例的ValueError错误
问题原因
- 核心原因是Django迁移的
RunPython执行上下文存在模型隔离规则:迁移中所有模型操作必须使用通过apps.get_model()获取的历史版本模型实例,你当前代码中用get_user_model()拿到的是项目实时的User模型,和通过apps.get_model()获取的关联模型不属于同一个ORM上下文,两者的实例无法互相赋值,因此触发类型不匹配报错。 - 次要问题是拼写错误:你迁移代码中获取关联模型时写的是
UserRelatinoship,但实际定义的模型名为UserRelationship,少写了字母o。
修复方案
将setup_test函数中获取User模型的逻辑改为从迁移上下文获取,同时修正模型名拼写即可,修复后代码如下:
def setup_test(apps, schema_editor): # 从迁移上下文获取auth应用的User模型,不可使用get_user_model() User = apps.get_model('auth', 'User') User.objects.create_superuser("admin", "admin@gm.org", "123") x = User.objects.create_user( username="x", email="a@gm.org", password="123" ) y = User.objects.create_user( username="y", email="b@gm.org", password="123" ) # 修正模型名拼写错误 UserRelationship = apps.get_model("myapp", "UserRelationship") UserRelationship.objects.create(x=x, y=y, active=True)
运行时表单正常的原因
服务运行时的代码使用的都是同一个上下文的实时模型,不存在迁移场景下的历史模型和实时模型的隔离,因此赋值逻辑可以正常执行。
内容的提问来源于stack exchange,提问作者Cory Nezin
相关产品推荐
相关产品推荐

