Django,在 self 类中的多对多关系中,我如何在 ORM 方面相互引用?
Posted
技术标签:
【中文标题】Django,在 self 类中的多对多关系中,我如何在 ORM 方面相互引用?【英文标题】:Django, in many to many relationship within the self class, how do I reference each other in terms of ORM? 【发布时间】:2018-02-01 12:40:51 【问题描述】:class User(models.Model):
name = models.CharField(max_length=100)
age = models.IntegerField()
gender = models.IntegerField()
email = models.CharField(max_length=100)
password = models.CharField(max_length=255)
following = models.ManyToManyField("self", related_name='followers')
objects = UserManager()
def __repr__(self):
return "User: 0".format(self.name)
在我的模型User中,用户可以互相关注和关注。
我可以通过这个找到用户关注的人:
user1 = User.objects.get(id=1)
following = user1.following.all()
但是,我不知道如何找到用户关注的对象。
我试过了:
user1.followers.all()
因为它是我模型中以下字段中的相关名称。
谁能教我怎么做?
非常感谢。
【问题讨论】:
How to implement followers/following in Django的可能重复 【参考方案1】:您应该将symmetrical
属性传递为False
。
来自文档:
当 Django 处理这个模型时,它识别出它自己有一个
ManyToManyField
,因此,它没有向User
类添加一个followers
属性。相反,ManyToManyField
被假定为对称的——也就是说,如果我是你的follower
,那么你就是我的follower
。如果您不希望与
self
的多对多关系对称,请将symmetrical
设置为False
。这将强制 Django 为反向关系添加描述符,允许ManyToManyField
关系是非对称的。
在你的情况下:
class User(models.Model):
# ...
following = models.ManyToManyField('self', related_name='followers', symmetrical=False)
# ...
然后在您的views.py
中您可以同时访问:
following = user.following.all()
followers = user.followers.all()
现在与self
的关系是非对称的。
【讨论】:
以上是关于Django,在 self 类中的多对多关系中,我如何在 ORM 方面相互引用?的主要内容,如果未能解决你的问题,请参考以下文章