サイトで最も人気のあるユーザーを獲得するアルゴリズムを作成する必要があります。どうやって始めたらいいのかわからない。考慮しなければならないこと: - フォロワーの数 - 投稿されたコメント/トピックの数 - ユーザーが受け取った肯定的な投票の数 - グループメンバーシップの数
私はこのようなことを試しました:
UserProfile.objects.annotate(num_topic=Count('topic')).order_by('-num_topic')
これにより、最もトピック順に並べられた userProfile のリストが表示されますが、それらすべてを組み合わせる方法がわかりません。
comment / topic / group / likeComment は、ユーザーへの外部キーを持つテーブルです。フォロワー / フォローは、リレーションシップという名前のテーブルを介した ManyToManyField です。
どんな助けでも大歓迎です
これまでのところ、私はここにいます:
topUsers = UserProfile.objects.annotate(num_topic=Count('topic', distinct=True)).annotate(num_comment=Count('comment', distinct=True))
for user in topUsers:
user.positive_votes = LikeComment.objects.filter(Q(type = 1), Q(comment__user=user) | Q(topic__user=user) ).count()
user.negaive_votes = LikeComment.objects.filter(Q(type = 0), Q(comment__user=user) | Q(topic__user=user) ).count()
user.num_group = GroupUser.objects.filter(user = user, status=1).count()
user.num_followers = user.related_to.filter(from_people__status=1, from_people__to_person=user).count()
user.num_followings = user.relationships.filter(to_people__status=1, to_people__from_person=user).count()
しかし、私がするとき
topUsers.order_by('-num_followers','-num_topic','-num_comment','-positive_vote','-num_group','-num_followings')
それはそれらを注文しません。
追加のフィールドを使用しようとしましたが、SQL で迷子になりました...
ありがとう