如何在Django中实现关注/粉丝功能
我想在我的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)