1

我想按顺序(作为排名)显示与登录用户有更多共同点的用户。我有这个代码:

me = User.objects.get(pk=sesion)

keywords = me.likes
result = []
for keyword in keywords.split(','):
    result += list(User.objects.filter(likes__icontains=keyword).exclude(id=sesion))

但是这段代码显示了这样的内容:

Username A
Username B
Username A
Username B
Username B
Username C

我想变成这样:

Username B
Username A
Username C

因为用户“B”和“我”有更多的共同点。

有谁知道我该怎么做?

谢谢

4

2 回答 2

2

您可以使用Counter该类:

>>> Counter(result).most_common()
[('b', 3), ('a', 2), ('c', 1)]

或者,使用Count并让数据库做这些事情:

User.objects.filter(likes__icontains=keyword)
            .exclude(id=sesion)
            .annotate(total_likes=Count('likes'))
            .order_by('total_likes')
于 2013-05-22T10:41:50.973 回答
1

让我们说为了争论,你没有制作另一个模型的可能性。

那你可以做的是:

keywords = [word.lower() for word in me.likes.split(',')]
result = User.objects.filter(likes__in=keywords)
                     .exclude(id=sesion)
                     .annotate(most_likes=Count('likes'))
                     .order_by('most_likes')

for这将为您拥有的每个关键字保存对查询集的评估。当你在做[]周围的时候,你正在评估查询集User.objects...

于 2013-05-22T10:46:55.510 回答