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 方面相互引用?的主要内容,如果未能解决你的问题,请参考以下文章

从 Django 查询中的多对多关系中检索项目

如何从django orm中的多对多关系表中提取数据

Django中的多对多查找

将 Django 中的多对多关系表示为两个多项选择

在 django 的多对多关系中添加额外的字段

使 ModelForm 与 Django 中的中间模型的多对多关系工作的步骤是啥?