Django模型迁移后修改related_name字段出现冲突如何解决
问题描述
我最初创建了如下所示的模型:
class MyModel(models.Model): creator = models.ForeignKey(User, on_delete=models.CASCADE, related_name="creater") # 其余字段定义
注意creator是ForeignKey关联字段,我把它的related_name误拼写成了creater,之后我执行了python manage.py makemigrations和python manage.py migrate命令,运行正常。
之后我发现了拼写问题,把参数修正为如下内容:
class MyModel(models.Model): creator = models.ForeignKey(User, on_delete=models.CASCADE, related_name="creator") # 其余字段定义
我再次执行上述两条命令应用修改,运行python manage.py makemigrations时收到如下报错:
(django_env) dayanandghelaro@A006-00592 fiverr_backend % python manage.py makemigrations SystemCheckError: 系统检查发现以下问题: 错误: gigs.Gig.creator: (fields.E304) 'gigs.Gig.creator'的反向访问器与'orders.Order.creator'的反向访问器冲突 提示:请为'gigs.Gig.creator'或'orders.Order.creator'添加或修改related_name参数 gigs.Gig.creator: (fields.E305) 'gigs.Gig.creator'的反向查询名与'orders.Order.creator'的反向查询名冲突 提示:请为'gigs.Gig.creator'或'orders.Order.creator'添加或修改related_name参数 orders.Order.creator: (fields.E304) 'orders.Order.creator'的反向访问器与'gigs.Gig.creator'的反向访问器冲突 提示:请为'orders.Order.creator'或'gigs.Gig.creator'添加或修改related_name参数 orders.Order.creator: (fields.E305) 'orders.Order.creator'的反向查询名与'gigs.Gig.creator'的反向查询名冲突 提示:请为'orders.Order.creator'或'gigs.Gig.creator'添加或修改related_name参数
解决方案
这个报错和你之前修改拼写错误没有直接关系,核心原因是gigs应用的Gig模型和orders应用的Order模型都给关联User的字段设了相同的related_name值,Django在生成User模型的反向查询属性时出现命名冲突。
按照以下步骤操作即可解决:
- 为两个模型的creator字段设置不同的
related_name,避免冲突。可以给名称加上所属模型的标识,比如Gig模型的related_name改为gig_creators,Order模型的related_name改为order_creators。 - 如果你不想手动命名,也可以直接用Django内置的模板变量自动生成唯一名称,写法如下:
这种写法会自动把应用名和模型名代入,不会出现冲突。creator = models.ForeignKey(User, on_delete=models.CASCADE, related_name="%(app_label)s_%(class)s_creator") - 确认所有字段的related_name没有重复后,重新执行
python manage.py makemigrations,即可正常生成迁移文件。 - 执行
python manage.py migrate应用迁移,修改就会生效。
内容的提问来源于stack exchange,提问作者Dayanand
相关产品推荐
相关产品推荐

