Объединение запросов Django с выражениями

У меня есть модель 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-выражениями.

Есть ли способ сделать это?

7
задан Serjik 19 December 2015 в 11:36
поделиться