0

我有一个跟踪追随者的模型。这是与其他所有社交网站类似的想法。

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

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

我正在执行多个查询。呸。我正在从我的 raw 中构建一个列表以用于Q(pk__in=mutual_follows). 呸。我很好奇人们有什么建议来提高这种逻辑的效率。

这是UserProfile模型

class UserProfile(models.Model):
    user = models.OneToOneField(User)
    ...
    follow = models.ManyToManyField('self', blank = True, 
                                    symmetrical=False, through='Follow')
    ...
4

1 回答 1

1

我不完全确定您要实现什么,但是如果我做对了,您希望所有用户都Follow存在对象,其对象在哪里request.use,追随者在哪里request.user(我认为这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()
于 2013-05-25T22:17:37.313 回答