【发布时间】:2011-10-08 23:34:26
【问题描述】:
我正在使用 Django 编写一个社交网络应用程序,并且需要实现一个类似于 Facebook“Mutual Friends”概念的功能。我有一个像这样的简单模型:
class Friend(models.Model):
user = models.ForeignKey(User)
guid = models.BigIntegerField()
name = models.TextField()
class Meta:
unique_together = ['user', 'facebook_id']
它代表了我网站的用户和他的一个朋友之间的关系。 (朋友不一定也是用户)两个用户之间的共同朋友的数量可以计算为他们的朋友列表的交集,换句话说,
users = User.objects.all()
friends = Friend.objects.filter(user=request.user)
friend_ids = [f.guid for f in friends]
for user in users:
user.mutual = Friend.objects.filter(user=user, guid__in=friend_ids).count()
(执行上述操作的更有效方法将获得奖励积分)。
我的主要问题是,在计算了用户之间的共同朋友数量之后,我现在如何根据当前用户的共同朋友数量订购users 查询集?我不能,在这种情况下,将计数保存为注释或额外字段,因为它依赖于被检查的特定用户以及他所有朋友的某个子集。我可以以某种巧妙的方式使用annotate 或extra 方法吗?还是raw sql 查询是唯一的方法?如果有,怎么做?
总结:
计算每个用户的共同好友数量不是问题。鉴于每个用户的信息,您如何根据该号码继续订购QuerySet?
【问题讨论】:
标签: sql django django-models