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ć?

questionAnswers(4)

yourAnswerToTheQuestion