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)

django 执行 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()
链接到文章: https://ixvps.com/46877.html

发表回复

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