Django,在self类中的多对多关系中,如何在ORM方面互相引用?

Jun*_*ung 3 django orm many-to-many django-models m2m

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)
Run Code Online (Sandbox Code Playgroud)

在我的模型User中,用户可以彼此跟随。

我可以找到用户关注的对象:

user1 = User.objects.get(id=1)
following = user1.following.all()
Run Code Online (Sandbox Code Playgroud)

但是,我不知道如何找到用户的关注对象。

我试过了:

user1.followers.all()
Run Code Online (Sandbox Code Playgroud)

因为它是我模型中以下字段中的related_name。

有人可以教我该怎么做吗?

非常感谢你。

wen*_*isa 8

您应该将symmetrical属性传递为False

从文档:

Django处理此模型时,会确定其ManyToManyField本身具有,因此不会followersUser该类添加属性。而是ManyToManyField假定对称-即,如果我是您follower,则您是我follower

如果您不希望与保持多对多关系的对称性self,请将设置symmetricalFalse。这将迫使Django为反向关系添加描述符,从而允许ManyToManyField关系非对称。

在您的情况下:

class User(models.Model):
    # ...
    following = models.ManyToManyField('self', related_name='followers', symmetrical=False)
    # ...
Run Code Online (Sandbox Code Playgroud)

然后,您views.py可以同时访问两个:

following = user.following.all()
followers = user.followers.all()
Run Code Online (Sandbox Code Playgroud)

从现在开始,与的关系self是不对称的。