У меня есть модель XYZ и мне нужно получить максимальное значение для полей a, b и выражение x/y для заданного набора запросов.
Это прекрасно работает для полей. Что-то вроде:
>>> XYZ.all().aggregate(Max('a'))
... {'a__max': 10}
Однако я не могу найти способ сделать это для выражений. Попытка что-то вроде:
>>> XYZ.all().aggregate(Max('x/y'))
Выдает ошибку:
*** FieldError: Cannot resolve keyword 'x/y' into field. Choices are: a, b, x, y, id
Попытка что-то вроде:
>>> XYZ.all().aggregate(Max(F('x')/F('y')))
Выдает ошибку:
*** AttributeError: 'ExpressionNode' object has no attribute 'split'
И даже что-то вроде:
XYZ.all().extra(select={'z':'x/y'}).aggregate(Max('z'))
Тоже не работает и выдает ту же ошибку, что и выше:
FieldError: Cannot resolve keyword 'z' into field. Choices are: a, b, x, y, id
Один хак I Найден способ сделать это :
XYZ.all().extra(select={'z':'MAX(x/y)'})[0].z
. Что на самом деле работает, потому что генерирует правильный SQL, но это сбивает с толку, потому что я получаю правильное значение атрибута z, но не правильный экземпляр, тот, который имеет это максимальное значение.
Конечно, я мог бы также использовать необработанные запросы или приемы с дополнительными ()и упорядочивать _по (), но для меня действительно не имеет смысла, что Django полностью поддерживает агрегированные запросы в хороший способ, но не может поддерживать выражения даже с собственными F-выражениями.
Есть ли способ сделать это?