Consultas agregadas de Django con expresiones.

Tengo un modelo XYZ y necesito obtener el valor máximo para los campos a, b y la expresión x / y para un conjunto de consultas determinado.

Funciona maravillosamente para los campos. Algo como:

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

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

Sin embargo, no puedo encontrar una manera de hacerlo para las expresiones. Intentando algo como:

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

Da un error:

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

Intentando algo como:

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

Da un error:

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

E incluso algo como:

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

Tampoco funciona y da el mismo error que el anterior:

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

El único truco que encontré para hacerlo es:

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

Lo que realmente funciona porque genera el SQL correcto, pero es confuso porque obtengo el valor correcto en el atributo z, pero no la instancia correcta, la que tiene ese valor máximo.

Por supuesto, también podría usar consultas en bruto o trucos con extra () y order_by (), pero realmente no tiene sentido para mí que Django haga todo lo posible para admitir consultas agregadas de una manera agradable, pero no puede admitir Expresiones incluso con sus propias expresiones F.

¿Hay alguna forma de hacerlo?

Respuestas a la pregunta(4)

Su respuesta a la pregunta