我有一个跟踪追随者的模型。这是与其他所有社交网站类似的想法。
现在我的模型看起来像这样。
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')
...