Django:HINT: Add or change a related_name argument to the definition for ‘x.person_1‘ or ‘x.person‘.

想了很多天,想到使用model添加很多备用的Person数据,如下

class Project(models.Model):
    name = models.CharField(max_length=100)
    video = models.ForeignKey(Video, on_delete=models.CASCADE, null=True)
    person = models.ForeignKey(Person, null=True, blank=True, on_delete=models.SET_NULL)
    person_1 = models.ForeignKey(Person, null=True, blank=True, on_delete=models.SET_NULL)
    person_2 = models.ForeignKey(Person, null=True, blank=True, on_delete=models.SET_NULL)
    person_3 = models.ForeignKey(Person, null=True, blank=True, on_delete=models.SET_NULL)
    person_4 = models.ForeignKey(Person, null=True, blank=True, on_delete=models.SET_NULL)
    person_5 = models.ForeignKey(Person, null=True, blank=True, on_delete=models.SET_NULL)
    # 结果一开始容许为空 null=True
    result = models.ForeignKey(Result, null=True, blank=True, on_delete=models.SET_NULL)

可是报错,不能这样搞

[root@lm videoproject]# python manage.py makemigrations
SystemCheckError: System check identified some issues:

ERRORS:
cut.Project.person: (fields.E304) Reverse accessor for 'Project.person' clashes with reverse accessor for 'Project.person_1'.
        HINT: Add or change a related_name argument to the definition for 'Project.person' or 'Project.person_1'.
cut.Project.person: (fields.E304) Reverse accessor for 'Project.person' clashes with reverse accessor for 'Project.person_2'.
        HINT: Add or change a related_name argument to the definition for 'Project.person' or 'Project.person_2'.
cut.Project.person: (fields.E304) Reverse accessor for 'Project.person' clashes with reverse accessor for 'Project.person_3'.

解决方案(如上所述,添加一个related_name):

原理解释:
如果不加related_name,那么Project有多个Person外键,当某一个Person反向查找遍历的时候,都是查找person_set,由于两个反向关系使用相同的名称,因此将导致歧义。

class Project(models.Model):
    name = models.CharField(max_length=100)
    video = models.ForeignKey(Video, on_delete=models.CASCADE, null=True)
    person = models.ForeignKey(Person, null=True, blank=True, on_delete=models.SET_NULL, related_name='person_0')
    person_1 = models.ForeignKey(Person, null=True, blank=True, on_delete=models.SET_NULL, related_name='person_1')
    person_2 = models.ForeignKey(Person, null=True, blank=True, on_delete=models.SET_NULL, related_name='person_2')
    person_3 = models.ForeignKey(Person, null=True, blank=True, on_delete=models.SET_NULL, related_name='person_3')
    person_4 = models.ForeignKey(Person, null=True, blank=True, on_delete=models.SET_NULL, related_name='person_4')
    person_5 = models.ForeignKey(Person, null=True, blank=True, on_delete=models.SET_NULL, related_name='person_5')
    # 结果一开始容许为空 null=True
    result = models.ForeignKey(Result, null=True, blank=True, on_delete=models.SET_NULL)

参考

https://stackoverflow.com/questions/58788480/python-error-fields-e304-reverse-accessor-for-field-clashes-with-reverse-acc

https://blog.csdn.net/m0_37156322/article/details/86691765

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值