2017-01-23 4 views
1

私はページ上で実行するクエリの数を制限しようとしています。クエリーセットは、過去24時間以内に作成されたオブジェクトを返します。私はその後、フィールドに基づいてオブジェクトを数えるためにそのクエリーセットをフィルタリングしたい。Django:クエリーセットをフィルタリングしてからカウントする

例(この例では)ブランドの増加により

cars = self.get_queryset() 
volvos_count = cars.filter(brand="Volvo").count() 
mercs_count = cars.filter(brand="Merc").count() 

、クエリの数を照会しなければならないブランドの数と共に直線的に成長します。

ブランドのユニークな値とクエリーセット内のインスタンスの数をすべて返す自動車のクエリを作成するにはどうすればよいですか?

結果:

{'volvos': 4, 'mercs': 50, ...} 

ありがとう!

EDIT:コメント

これまでのところ、彼らがされている近くではなく、かなりのマークに。 values_list( 'brand'、flat = True)を使用するとブランドが返されます。そこから使用することができます

from collections import Counter 

合計を返すには。これを単一のクエリから行う方法があれば大丈夫ですが、可能ではないかもしれません。

答えて

2

各個別のブランドのカウントを生成するには、あなたがannotateと一緒にvaluesを使用しています。

totals = cars.values('brand').annotate(Count('brand')) 

これは、その要素のそれぞれは、brandbrand__countと辞書で、あなたにクエリセットを提供します。近い

{item['brand']: item['brand__count'] for item in totals} 
+0

は、それがこれを行うための一つの方法のように思えるだけqueryset.values_list(「ブランド」、=真平ら)で、その後、カウンターを使用します。あなたが望む直接形式の辞書にそれを変換することができますその結果それは私が探していた値とカウントを返します。 – Emile

+0

カウンターの使用は実際には効果がありますが、かなりの量の結果を得始めると非常に遅くなります。そのような作業は、データベースにはるかに適しています。 – Shadow

0
SELECT brand, COUNT(*) as total 
FROM cars 
GROUP BY brand 
ORDER BY total DESC 

等価:

cars.objects.all().values('brand').annotate(total=Count('brand')).order_by('total')

関連する問題