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?