我希望按顺序显示(作为排名)与用户有更多共同点的用户。 我有这段代码:
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”与“我”有更多共同点。
有谁知道我该怎么做?
由于
答案 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...
时,您正在评估查询集