我有一个跟踪粉丝的模型。这与其他所有社交网站都有类似的想法。
现在我的模型看起来像这样。
class Follow(models.Model):
follower = models.ForeignKey(UserProfile, related_name='follower')
following = models.ForeignKey(UserProfile, related_name='following')
follow_date = models.DateTimeField(auto_now_add=True)
今天我去添加一些需要相互关系的功能。人a跟随b和b跟随a。我也希望包括当前登录的用户,所以我使用了Q。
mutual_follows_qs = Follow.objects.raw('select o.* from follow o ' + \
'inner join follow f ' + \
'on o.following_id = f.follower_id' + \
' and o.follower_id = f.following_id' + \
' where o.follower_id = %s', [str(request.user.pk)])
mutual_follows = []
for mutual_follow in mutual_follows_qs:
mutual_follows.append(mutual_follow.following.pk)
possible_users = User.objects.filter(Q(pk__in=mutual_follows) \
| Q(pk=request.user.pk)).order_by('username')
我正在执行多个查询。呸。我正在构建一个原始列表,以便在Q(pk__in=mutual_follows)
中使用。呸。我很好奇人们有什么建议来提高这种逻辑的效率。
以下是UserProfile
型号
class UserProfile(models.Model):
user = models.OneToOneField(User)
...
follow = models.ManyToManyField('self', blank = True,
symmetrical=False, through='Follow')
...
答案 0 :(得分:1)
我不完全确定你要实现的目标,但是如果我做得对,你想要Follow
对象存在的所有用户,其中request.use
是关注者,而request.user
是{遵循{1}}(我认为related_names
有点混乱)。
在您的源代码中,您使用了UserProfile
和User
模型,不确定这是不是故意或有意,但假设只有User
模型可能会有效:
user = request.user
users = User.objects.filter(
Q(Q(follower__follower=user) & Q(following__following=user)) |
Q(pk=user.pk))).distinct()