如何从 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()
我交了一个叫 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()