katsumasa0514
@katsumasa0514 (ASAP k)

Are you sure you want to delete the question?

Leaving a resolved question undeleted may help others!

djangoでDBからobjectsとannotateとorder_byを使いQuerySetを取得

解決したいこと

WEBアプリを作成しています。
今回DBにあるカラム(follower)をデータの数順にソートしたいと思いコードを書きました。
しかし、データを思うようにソートできなかったので質問させてください。

models.py
class Follow(models.Model):
    owner = models.ForeignKey(User, on_delete=models.CASCADE, related_name='follow_owner')
    following = models.IntegerField(null=True)
    follower = models.IntegerField(null=True)
views.py
def reviewer_ranking(request):
    rankingDataOrg = Follow.objects.annotate(total=Count(
        'follower')).order_by('-total')[:15]
    print(rankingDataOrg)

    params = {
        'rankingDataOrg': rankingDataOrg,
    }
    return render(request, 'movieist/reviewer_ranking.html', params)

このように書いてもカラム(follower)はランダムに出力されてしまいます。
そこで『values('follower')』を追加してみました。

views.py
def reviewer_ranking(request):
    rankingDataOrg = Follow.objects.values('follower').annotate(total=Count(
        'follower')).order_by('-total')[:15]
    print(rankingDataOrg)

    params = {
        'rankingDataOrg': rankingDataOrg,
    }
    return render(request, 'movieist/reviewer_ranking.html', params)
QuerySet
<QuerySet [{'follower': 276, 'total': 13}, {'follower': 693, 'total': 12}, {'follower': 142, 'total': 12}, {'follower': 63, 'total': 11}, {'follower': 948, 'total': 11}, {'follower': 153, 'total': 10}, {'follower': 452, 'total': 10}, {'follower': 211, 'total': 10}, {'follower': 828, 'total': 10}, {'follower': 21, 'total': 10}, {'follower': 944, 'total': 10}, {'follower': 297, 'total': 9}, {'follower': 396, 'total': 9}, {'follower': 564, 'total': 9}, {'follower': 315, 'total': 9}]>

QuerySetのtotalをみていただいて分かるとおりカラム(follower)の数順にソートすることができました。
しかし、カラムは他にもあるのにfollower以外出力されません。
全てのカラムをfollowerの数順にソートしデータを得る方法が分かる方がお見えになればご教授いただけたらと思います。

至らない点も多々あるかと思いますがよろしくお願いします。

0

1Answer

解決しました。

values('○○○')に入れる値を間違えていました。
values('owner')でグループ化してからfollowerをカウントしないと行けませんでした。
ご協力ありがとうございました。

0Like

Your answer might help someone💌