モデルXYZがあり、与えられたクエリセットのフィールドa、b、および式x/yの最大値を取得する必要があります。Django式で式を集約する
これはフィールドで美しく機能します。何かのように:
>>> 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 atttributeで正しい値を取得するので、混乱しますが、正しいインスタンスではなく、最大値を持つインスタンスではありません。
もちろん、私はextra()とorder_by()で生のクエリやトリックを使うこともできますが、Djangoが集約クエリをうまくやってくれることは間違いありませんが独自のF式でも式をサポートすることはできません。
これを行う方法はありますか?
あなたは集計に 'F()'オブジェクトを使用する機能は、[今後のDjangoの1.8リリースの一部]であることを知って興味がある可能性があり(https://code.djangoproject.com/ wiki/Version1.8Roadmap)。 –