コメントの数でdjangoのアイテムのリストを並べ替えようとしています。ただし、Count 関数は、django コメントも content_type_id を使用して異なるオブジェクトのコメントを識別するという事実を考慮していないという問題があるようです!
これは、標準的な方法を使用すると、すべてのオブジェクトのコメント数が間違っているという点で、少し問題があります。「良い」修正はありますか、生のSQLに戻す必要がありますか?
正しい順序を試すコード:
app_list = App.objects.filter(published=True)
.annotate(num_comments=Count('comments'))
.order_by('-num_comments')
クエリからのサンプル出力 (コンテンツ タイプ ID について言及していないことに注意してください):
SELECT "apps_app"."id", "apps_app"."name",
"apps_app"."description","apps_app"."author_name", "apps_app"."site_url",
"apps_app"."source_url", "apps_app"."date_added", "apps_app"."date_modified",
"apps_app"."published", "apps_app"."published_email_sent", "apps_app"."created_by_id",
"apps_app"."rating_votes", "apps_app"."rating_score", COUNT("django_comments"."id") AS
"num_comments" FROM "apps_app" LEFT OUTER JOIN "django_comments" ON ("apps_app"."id" =
"django_comments"."object_pk") WHERE "apps_app"."published" = 1 GROUP BY
"apps_app"."id", "apps_app"."name", "apps_app"."description", "apps_app"."author_name",
"apps_app"."site_url", "apps_app"."source_url", "apps_app"."date_added",
"apps_app"."date_modified", "apps_app"."published", "apps_app"."published_email_sent",
"apps_app"."created_by_id", "apps_app"."rating_votes", "apps_app"."rating_score" ORDER
BY num_comments DESC LIMIT 4