我正在尝试制作Twitter克隆。
该应用有一系列用户,每个用户都有一个用户个人资料。 UserProfile模型如下
class UserProfiles(models.Model):
authenticated_user = models.OneToOneField(User, related_name="user_profile")
handle = models.CharField(max_length=50)
display_name = models.CharField(max_length=50)
following = models.ManyToManyField("self", related_name="followers", null=True)
def __str__(self):
return self.authenticated_user.handle
“follow”属性是与UserProfiles的多对多关系,因为每个用户配置文件都可以跟随许多其他配置文件,并且许多配置文件可以跟随另一个配置文件。
如果我有一个UserProfiles实例,我们称之为current_user,我可以通过
找到它所关注的配置文件数量current_user.following.count
我还想告诉用户有多少人关注他们。由于related_name参数设置为“followers”,因此我可以通过执行来获得关注者数量
current_user.followers.count
然而,这会返回一个错误,“'UserProfiles'对象没有属性'关注者'”
为什么不能做我的工作?我该怎么做呢?
答案 0 :(得分:1)
与self的默认m2m关系在django中是对称的。如果你看一下documentation:
当Django处理此模型时,它会识别出它自身有
ManyToManyField
,因此,它不会向person_set
类添加Person
属性。相反,ManyToManyField
被假定为symmetrica
l - 也就是说,如果我是你的朋友,那么你就是我的朋友。如果您不希望与
self
的多对多关系具有对称性,请将symmetrical
设置为False
。这将迫使Django为反向关系添加描述符,允许ManyToManyField
关系是非对称的。
在您的情况下,由于m2m关系的symmetrical
属性为true,表示:
A is following B => B is following A
但如果您需要following
和followers
关系,则需要设置symmetrical=False
:
following = models.ManyToManyField("self", related_name="followers",
symmetrical=False, null=True)