私はDjangoアプリにManyToManyフィールドを持つItem
モデルを持っています。このモデルは中間のお気に入りモデルで処理されます。問題のモデルの簡略化したバージョンを次に示します。Django:関連フィールドのカウントに基づいてQuerySetを注文する最速の方法は何ですか?
class Item(models.Model):
name = models.CharField(max_length=200)
class Favorite(models.Model):
user = models.ForeignKey(User)
item = models.ForeignKey(Item)
お気に入りの数で注文した商品のリストを取得しようとしています。以下のクエリは機能しますが、Itemテーブルには何千ものレコードがあり、クエリを完了するまで数分かかることがあります。これは、潜在的な解答に関連しているが、私は使用して結果をページ付けてる場合
items = Item.objects.annotate(num_favorites=Count('favorite')).order_by('-num_favorites')
わからないDjangoのビルトインPagintor:私は私の項目にfavorites
フィールドを追加することができます知っている
paginator = Paginator(items, 100)
をモデルとインクリメントを追加することができますが、合理的な時間にこのデータを取得するための、よりクリーンで効率的な方法があるのだろうかと思います。
+----+-------------+--------------------+------+-----------------------------+-----------------------------+---------+-------------------------------+------+---------------------------------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+----+-------------+--------------------+------+-----------------------------+-----------------------------+---------+-------------------------------+------+---------------------------------+
| 1 | SIMPLE | appname_item | ALL | NULL | NULL | NULL | NULL | 566 | Using temporary; Using filesort |
| 1 | SIMPLE | appname_favorite | ref | appname_favorite_67b70d25 | appname_favorite_67b70d25 | 4 | appname.appname_item.id | 1 | |
+----+-------------+--------------------+------+-----------------------------+-----------------------------+---------+-------------------------------+------+---------------------------------+
@Aamirに感謝していますが、今はもうこれを調べる機会がありました。私はあなたの質問への答えを見て、しかし私は持っている問題にそれを適用する方法がわかりません。これに関するMySQLのドキュメントはかなり疎そうです。上記の質問にEXPLAINの出力を追加しました。あなたはそれが意味するものとその修正方法を理解する助けになると思いますか?ありがとう! –