如何在Django中实现关注/粉丝功能

20 投票
2 回答
9379 浏览
提问于 2025-04-16 18:51

我想在我的Django应用中实现关注和被关注的功能。

我为每个用户(django.contrib.auth.User)创建了一个UserProfile类:

class UserProfile(models.Model):
    user = models.ForeignKey(User, unique = True, related_name = 'user')
    follows = models.ManyToManyField("self", related_name = 'follows')

所以我在Python命令行中尝试这样做:

>>> user_1 = User.objects.get(pk = 1) # <-- mark
>>> user_2 = User.objects.get(pk = 2) # <-- john
>>> user_1.get_profile().follows.add(user_2.get_profile())
>>> user_1.get_profile().follows.all()
[<UserProfile: john>]
>>> user_2.get_profile().follows.all()
[<UserProfile: mark>]

但是你可以看到,当我把一个新用户添加到某个用户的follows字段时,另一边也会自动建立对称关系。也就是说,如果用户1关注用户2,那么用户2也会自动关注用户1,这显然是错误的。

我哪里出错了?有没有办法正确实现关注和被关注的功能?

谢谢大家。

2 个回答

17

除了mouad的回答,我想建议你选择一个不同的*related_name*:如果马克关注了约翰,那么马克就是约翰的一个粉丝,对吧?

29

在你的多对多关系中,将 symmetrical 设置为 False:

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

撰写回答