如何从 Django 中的 ManyToMany 关系 class 中读取对象

How to read Objects from ManyToMany Relation class in django

我交了一个叫 class 的朋友,我想把用户作为关注者联系起来。从这里 class 我无法读取那些正在关注另一个用户的用户。例如,如果 'a' 用户流向 'b' 用户。然后我想从 b 的用户 ID 中获取跟随 b 的用户的名称,并将它们显示为 a 的关注者。此 class 也不存储关注用户和关注用户的用户 ID。我是多对多关系领域的新手。请帮忙。

Models.py中的代码

class Friend(models.Model):

    users = models.ManyToManyField(User)

    current_user = models.ForeignKey(User, related_name='follower', null=True,on_delete=models.CASCADE)

    @classmethod

    def make_friend(cls, current_user, new_friend):

        friend, created = cls.objects.get_or_create(

            current_user = current_user

        )

        friend.users.add(new_friend)

它在views.py中的作用是

def change_friends(request, operation, pk):

    friend = User.objects.get(pk=pk)

    if operation == 'add':

        Friend.make_friend(request.user, friend)

    elif operation == 'remove':

        Friend.lose_friend(request.user, friend)

    return redirect('home')

其urls.py中的url是

path('connect/<operation>/<pk>)',views.change_friends, name='change_friends')

在您的方法中,您没有保存修改。

当您执行 friend.make_friend(...) 时,您应该保存 friend 对象:friend.save(),因此 m2m 字段也可以保存。

更新 Friend 对象的 users 字段的其他方法也是如此。

您可以创建 custom user model 定义多对多关系的朋友模型,而不是创建朋友模型。如果用 symmetrical=False 定义 ManyToManyField 那么它将不是对称的

class CustomUser(AbstractUser):

    friends = models.ManyToManyField('self', symmetrical=False, related_name='followers')

您需要在设置中将此模型定义为您的用户模型

AUTH_USER_MODEL = 'you_app.CustomUser'

现在您可以直接从用户实例本身使用此关系

def change_friends(request, operation, pk):
    friend = CustomUser.objects.get(pk=pk)
    if operation == 'add':
        request.user.friends.add(friend)
    elif operation == 'remove':
        request.user.friends.remove(friend)
    return redirect('home')

现在您的 CustomUser 个实例将有 2 个可以查询的关系

request.user.friends.all()
request.user.followers.all()