Django agreguje zapytania z wyrażeniami
Mam model XYZ i muszę uzyskać maksymalną wartość dla pól a, b i wyrażenie x / y dla danego zestawu zapytań.
Działa pięknie dla pól. Coś jak:
<code>>>> XYZ.all().aggregate(Max('a')) ... {'a__max': 10} </code>
Jednak nie mogę znaleźć sposobu, aby to zrobić dla wyrażeń. Próbuję czegoś takiego:
<code>>>> XYZ.all().aggregate(Max('x/y')) </code>
Daje błąd:
<code>*** FieldError: Cannot resolve keyword 'x/y' into field. Choices are: a, b, x, y, id </code>
Próbuję czegoś takiego:
<code>>>> XYZ.all().aggregate(Max(F('x')/F('y'))) </code>
Daje błąd:
<code>*** AttributeError: 'ExpressionNode' object has no attribute 'split' </code>
A nawet coś takiego:
<code>XYZ.all().extra(select={'z':'x/y'}).aggregate(Max('z')) </code>
Również nie działa i podaje ten sam błąd co powyżej:
<code>FieldError: Cannot resolve keyword 'z' into field. Choices are: a, b, x, y, id </code>
Jedyny hack, który znalazłem to:
<code>XYZ.all().extra(select={'z':'MAX(x/y)'})[0].z </code>
Co właściwie działa, ponieważ generuje odpowiedni SQL, ale jest mylące, ponieważ otrzymuję właściwą wartość w atrybucie z, ale nie w odpowiedniej instancji, o tej maksymalnej wartości.
Oczywiście, mogłem również używać surowych zapytań lub sztuczek za pomocą extra () i order_by (), ale to naprawdę nie ma dla mnie sensu, że Django idzie na wszystkie sposoby, aby w miły sposób obsługiwać kwerendy, ale nie może obsługiwać wyrażenia nawet z własnymi wyrażeniami F.
Czy jest jakiś sposób, aby to zrobić?