(「所有者」)Item
とのm2m関係を持つ、というモデルがあります。User
アイテムごとに、それを所有しているユーザーを数える必要があります。それは十分に簡単ですannotate()
しかし、次に、特定の性別の所有者と各アイテムの総所有者数の比率を計算する必要があります。たとえば、5 人のユーザーのうち 2 人の男性がアイテムを所有している場合、比率は0.4
です。
それを行う最善の方法は何ですか?
(「所有者」)Item
とのm2m関係を持つ、というモデルがあります。User
アイテムごとに、それを所有しているユーザーを数える必要があります。それは十分に簡単ですannotate()
しかし、次に、特定の性別の所有者と各アイテムの総所有者数の比率を計算する必要があります。たとえば、5 人のユーザーのうち 2 人の男性がアイテムを所有している場合、比率は0.4
です。
それを行う最善の方法は何ですか?
ORM でこれを行うには、Django ではサポートされていない条件付き集計が必要です。 http://www.voteruniverse.com/Members/jlantz/blog/conditional-aggregates-in-djangoは、機能する可能性のあるハッキーなソリューションを提案しています。
比率で並べ替える必要がない場合は、注釈を付けるために 2 つの呼び出しを行い、Python で比率を計算できます。何かのようなもの:
items = Item.objects.annotate(ucount=Count('users')).annotate(ccount=CountIf(<condition>))
for item in items:
item.ratio = item.ucount / item.ccount
それをしたくない場合は、extra()
メソッドとカスタム SQL を使用して、必要な追加情報を取得することをお勧めします。そのメソッドのドキュメントは、Django クエリセット API ドキュメント ページにあります。
私の頭のすぐ上で、次のようなものが機能する可能性があります。必要に応じて、それを繰り返して完璧なソリューションを取得します。
items = Item.objects.annotate(Count('users'))
for item in items:
total = item.users__count
num_males = item.users.filter(gender='M').count()
num_females = item.users.filter(gender='F').count()