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')

これにより、クエリセットの評価がforfor each キーワードに保存されます。[]周りをやっているときにクエリセットを評価していますUser.objects...

于 2013-05-22T10:46:55.510 に答える