gpt4 book ai didi

sql - Django:根据相交对象(共同 friend )的数量排序项目

转载 作者:行者123 更新时间:2023-12-04 22:41:00 27 4
gpt4 key购买 nike

我正在使用 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']

它表示我网站的用户和他的一个 friend 之间的关系。 (好友不一定也是用户)两个用户之间的共同好友数可以计算为他们好友列表的交集,换句话说,

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 查询集进行排序? 在这种情况下,我不能将计数保存为注释或额外字段,因为它依赖于被检查的特定用户以及他所有 friend 中的特定子集。我能否以某种巧妙的方式使用 annotateextra 方法?还是 raw sql 查询是唯一的出路?如果是,怎么办?

总结:

计算每个用户的共同好友数不是问题。鉴于每个用户的信息,您如何根据该数字继续对 QuerySet 进行排序?

最佳答案

不确定这是否正是您正在寻找的,但是...

# get current users friends (assuming guid is unique for a friend?)
user_friend_guids = Friend.objects.values_list('guid', flat=True).filter(user=user)

# get Friend objects where user not current user, is in user_friend_list, group and count by user
mutual_friends = Friend.objects.values('user__username') \
.filter(guid__in=user_friend_guids).exclude(user=user) \
.annotate(number_mutual_friends=Count('user')) \
.order_by('-number_mutual_friends')

这将返回一个用户名列表,其中包含他们与用户分享的 friend 数量,按他们分享的数量排序。

然后在模板中:

{% for mutual_friend in mutual_friends %}
{{mutual_friend.user__username}} - {{mutual_friends.number_mutual_friends}}
{% endfor %}

关于sql - Django:根据相交对象(共同 friend )的数量排序项目,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6755384/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com