Django计数匹配查询与包含

时间:2013-05-22 10:34:15

标签: python django django-views

我希望按顺序显示(作为排名)与用户有更多共同点的用户。 我有这段代码:

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”与“我”有更多共同点。

有谁知道我该怎么做?

由于

2 个答案:

答案 0 :(得分: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')

答案 1 :(得分: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...时,您正在评估查询集