Django内心加入自我。有更有效的方法吗?

时间:2013-05-25 21:48:42

标签: django django-queryset

我有一个跟踪粉丝的模型。这与其他所有社交网站都有类似的想法。

现在我的模型看起来像这样。

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')
    ...

1 个答案:

答案 0 :(得分:1)

我不完全确定你要实现的目标,但是如果我做得对,你想要Follow对象存在的所有用户,其中request.use是关注者,而request.user是{遵循{1}}(我认为related_names有点混乱)。

在您的源代码中,您使用了UserProfileUser模型,不确定这是不是故意或有意,但假设只有User模型可能会有效:

user = request.user
users = User.objects.filter(
    Q(Q(follower__follower=user) & Q(following__following=user)) |
    Q(pk=user.pk))).distinct()