モデル XYZ があり、特定のクエリセットのフィールド a、b、および式 x/y の最大値を取得する必要があります。
それはフィールドのために美しく機能します。何かのようなもの:
>>> XYZ.all().aggregate(Max('a'))
... {'a__max': 10}
しかし、式に対してそれを行う方法が見つかりません。次のようなものを試してください:
>>> XYZ.all().aggregate(Max('x/y'))
エラーが発生します:
*** FieldError: Cannot resolve keyword 'x/y' into field. Choices are: a, b, x, y, id
次のようなものを試してください:
>>> XYZ.all().aggregate(Max(F('x')/F('y')))
エラーが発生します:
*** AttributeError: 'ExpressionNode' object has no attribute 'split'
そして、次のようなものさえ:
XYZ.all().extra(select={'z':'x/y'}).aggregate(Max('z'))
また、機能せず、上記と同じエラーが発生します。
FieldError: Cannot resolve keyword 'z' into field. Choices are: a, b, x, y, id
私が見つけた1つのハックは次のとおりです。
XYZ.all().extra(select={'z':'MAX(x/y)'})[0].z
これは正しい SQL を生成するため実際に機能しますが、z 属性で正しい値を取得するため、混乱を招きますが、その最大値を持つインスタンスは正しくありません。
もちろん、extra() と order_by() で生のクエリやトリックを使用することもできますが、Django が集約クエリをうまくサポートしているのにサポートできないというのは、私にはまったく意味がありません。独自の F 式を含む式。
それを行う方法はありますか?