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 preguntas dado.Consultas agregadas de Django con expresiones
Funciona muy bien para los campos. Algo así como:
>>> XYZ.all().aggregate(Max('a'))
... {'a__max': 10}
Sin embargo, no puedo encontrar la manera de hacerlo por expresiones. Intentar algo así como:
>>> XYZ.all().aggregate(Max('x/y'))
da un error:
*** FieldError: Cannot resolve keyword 'x/y' into field. Choices are: a, b, x, y, id
tratando algo como:
>>> XYZ.all().aggregate(Max(F('x')/F('y')))
da un error:
*** AttributeError: 'ExpressionNode' object has no attribute 'split'
E incluso algo como:
XYZ.all().extra(select={'z':'x/y'}).aggregate(Max('z'))
tampoco funciona y da el mismo error que el anterior:
FieldError: Cannot resolve keyword 'z' into field. Choices are: a, b, x, y, id
El truco que he encontrado para hacerlo es:
XYZ.all().extra(select={'z':'MAX(x/y)'})[0].z
Qué realmente funciona, ya que genera el SQL correcto, pero es confuso porque obtengo el valor correcto en el atributo z, pero no en el caso correcto, el que tiene ese valor máximo.
Por supuesto, también podría usar consultas crudas o trucos con extra() y order_by(), pero realmente no tiene sentido para mí que Django soporte todas las consultas agregadas de una manera agradable, pero no puede soportar expresiones incluso con sus propias expresiones F.
¿Hay alguna manera de hacerlo?
Usted puede estar interesado en saber que la capacidad de utilizar 'F()' objetos en los agregados es [parte de la próxima versión de Django 1.8] (https://code.djangoproject.com/ wiki/Version1.8Roadmap). –