先上表结构 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()