Django agrega consultas com expressões

Eu tenho um modelo XYZ e preciso obter o valor máximo para os campos a, b e expressão x / y para um determinado queryset.

Funciona lindamente para os campos. Algo como:

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

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

No entanto, não consigo encontrar uma maneira de fazer isso para expressões. Tentando algo como:

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

Dá um erro:

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

Tentando algo como:

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

Dá um erro:

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

E até algo parecido com:

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

Também não funciona e dá o mesmo erro acima:

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

O único hack que encontrei para fazer isso é:

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

O que realmente funciona porque gera o SQL correto, mas é confuso porque eu obtenho o valor correto no atributo z, mas não a instância certa, aquela com o valor máximo.

Claro, eu também poderia usar consultas ou truques brutos com extra () e order_by (), mas realmente não faz sentido para mim que o Django vá até o fim para suportar consultas agregadas de uma maneira agradável, mas não suporte expressões mesmo com suas próprias expressões.

Há alguma forma de fazer isso?

questionAnswers(4)

yourAnswerToTheQuestion