Django aggregiert Abfragen mit Ausdrücken

Ich habe ein Modell XYZ und muss den Maximalwert für die Felder a, b und den Ausdruck x / y für einen gegebenen Abfragesatz ermitteln.

Es funktioniert wunderbar für Felder. So etwas wie:

<code>>>> XYZ.all().aggregate(Max('a'))

... {'a__max': 10}
</code>

Ich kann jedoch keinen Weg finden, dies für Ausdrücke zu tun. Versuche so etwas wie:

<code>>>> XYZ.all().aggregate(Max('x/y'))
</code>

Gibt einen Fehler aus:

<code>*** FieldError: Cannot resolve keyword 'x/y' into field. Choices are: a, b, x, y, id
</code>

Versuche so etwas wie:

<code>>>> XYZ.all().aggregate(Max(F('x')/F('y')))
</code>

Gibt einen Fehler aus:

<code>*** AttributeError: 'ExpressionNode' object has no attribute 'split'
</code>

Und sogar so etwas wie:

<code>XYZ.all().extra(select={'z':'x/y'}).aggregate(Max('z'))
</code>

Funktioniert auch nicht und gibt den gleichen Fehler wie oben:

<code>FieldError: Cannot resolve keyword 'z' into field. Choices are: a, b, x, y, id
</code>

Der einzige Hack, den ich gefunden habe, ist:

<code>XYZ.all().extra(select={'z':'MAX(x/y)'})[0].z
</code>

Was tatsächlich funktioniert, weil es das richtige SQL generiert, aber es ist verwirrend, weil ich den richtigen Wert am z-Attribut erhalte, aber nicht die richtige Instanz, die mit diesem Maximalwert.

Natürlich könnte ich auch rohe Abfragen oder Tricks mit extra () und order_by () verwenden, aber es macht für mich wirklich keinen Sinn, dass Django den ganzen Weg geht, um aggregierte Abfragen auf nette Weise zu unterstützen, kann dies aber nicht Ausdrücke auch mit eigenen F-Ausdrücken.

Gibt es eine Möglichkeit, dies zu tun?

Antworten auf die Frage(4)

Ihre Antwort auf die Frage