投票のアプリについては、商品評価(「Product_r
」)(product_code
にグループ化されている)ごとに、product_code
,Count()
、製品レーティング> 3が必要です。Djangoのフィルタクエリで注釈付きの割合を計算する方法は?
私は最後の注釈式で計算を取り除くことができると思っていましたが、そうではないようです。
下記の試みは動作しませんq = Product_r.objects.all()\
.annotate(product_code=F('fk_product__product_code'))\
.values('product_code')\
.annotate(count=Count('id'))\
.annotate(proportion=Count(score__gt=3)/count)
のどちらかが(count
が定義されていないと文句を言い、そしてまたそれが全体クエリ、割合を計算していないだけで、その後の注釈部分をフィルタリング):
q = Product_r.objects.all()\
.annotate(product_code=F('fk_product__product_code'))\
.values('product_code')\
.annotate(count=Count('id'))\
.filter(score__gt=3)\
.annotate(proportion=Count('id')/count)
クエリを2回コーディングせずに(このうちの1つをscore__gt=3
でフィルタリング)、2つのcount
の値を分割する方法はありますか? This blog postは、この種の処理に未加工のSQLを使用しています。私がここで私の場合はそれを避けることができれば幸いです。
「Count( 'id')/ F( 'count') 'を試してください。私はそれが動作するかどうかはわかりませんが、定義されていないカウントについてのエラーを停止します。 – Alasdair
あなたは正しくありがとう、それはエラーを停止しました。クエリは依然として正しい出力を生成しません。フィルタはクエリ全体に適用され、すべての比率が「Count(すべて)/ Count(すべて)」すなわち1に等しくなります。 – Escher