django models反向关联related_name详解

先上表结构 models.py 代码如下

class PeojectUser(models.Model):
    # 项目参与者
    user = models.ForeignKey(to='UserInfo',on_delete=models.CASCADE)
    project = models.ForeignKey(to='Project',on_delete=models.CASCADE)
    star = models.BooleanField(default=False)
    invitee = models.ForeignKey(to='UserInfo',on_delete=models.CASCADE)
    create_datetime = models.DateTimeField(auto_now_add=True)

 执行 makemigrations 的时候,如果出现下面这种错误

SystemCheckError: System check identified some issues:

ERRORS:
web.PeojectUser.invitee: (fields.E304) Reverse accessor for 'PeojectUser.invitee' clashes with reverse accessor for 'PeojectUser.user'.
        HINT: Add or change a related_name argument to the definition for 'PeojectUser.invitee' or 'PeojectUser.user'.
web.PeojectUser.user: (fields.E304) Reverse accessor for 'PeojectUser.user' clashes with reverse accessor for 'PeojectUser.invitee'.
        HINT: Add or change a related_name argument to the definition for 'PeojectUser.user' or 'PeojectUser.invitee'.

这个问题出现的原因很简单,就是因为我们我们在PeojectUser 项目中有2个字段都进行了一对多的引用了UserInfo 表,这样会给后面进行反向查询的时候,造成django无法处理,因此提示是说我们是需要指定related_name
先说一个常规的问题:
正常我们的操作:

obj = UserInfo.objects.get(id=1)
obj.projectuser_set.all()

但是由于我们在PeojectUser设置了2个关联,因此在我们后续执行的时候,django不知道需要反向关联那个字段了。所以提示我们添加 related_name 字段
针对上面的例子,我们做一下修改:

```python
class PeojectUser(models.Model):
    # 项目参与者
    user = models.ForeignKey(to='UserInfo',on_delete=models.CASCADE,related_name='a')
    project = models.ForeignKey(to='Project',on_delete=models.CASCADE)
    star = models.BooleanField(default=False)
    invitee = models.ForeignKey(to='UserInfo',on_delete=models.CASCADE,related_name='b')
    create_datetime = models.DateTimeField(auto_now_add=True)

那么在设置了上面的格式后,如果要进行不同的反向关联,则就可以 使用如下方式:

obj = UserInfo.objects.get(id=1)
obj.a.all()
obj.b.all()

腾讯云限时秒杀【点击购买】

搬瓦工,CN2高速线路,1GB带宽,电信联通优化KVM,延迟低,速度快,建站稳定,搬瓦工BandwagonHost VPS优惠码BWH26FXH3HIQ,支持<支付宝> 【点击购买】!

Vultr$3.5日本节点,512M内存/500G流量/1G带宽,电信联通优化,延迟低,速度快【点击购买】!

阿里云香港、新加坡VPS/1核/1G/25G SSD/1T流量/30M带宽/年付¥288【点击购买】

百度云不止一折优惠【点击购买】

发表评论

电子邮件地址不会被公开。 必填项已用*标注