Mam model XYZ i potrzebuję uzyskać maksymalną wartość dla pól a, b i wyrażenie x/y dla danego zestawu zapytań.Kwerendy agregujące Django z wyrażeniami
Działa pięknie na pola. Coś jak:
>>> XYZ.all().aggregate(Max('a'))
... {'a__max': 10}
Jednak nie mogę znaleźć sposobu na wyrażenie. Próbuje coś takiego:
>>> XYZ.all().aggregate(Max('x/y'))
daje błąd:
*** FieldError: Cannot resolve keyword 'x/y' into field. Choices are: a, b, x, y, id
próbuje coś takiego:
>>> XYZ.all().aggregate(Max(F('x')/F('y')))
daje błąd:
*** AttributeError: 'ExpressionNode' object has no attribute 'split'
a nawet coś takiego:
XYZ.all().extra(select={'z':'x/y'}).aggregate(Max('z'))
również nie działa i daje ten sam błąd jak wyżej:
FieldError: Cannot resolve keyword 'z' into field. Choices are: a, b, x, y, id
jednej hack, znalazłem to zrobić to:
XYZ.all().extra(select={'z':'MAX(x/y)'})[0].z
co faktycznie działa, ponieważ generuje odpowiedni SQL, ale jest to mylące, ponieważ otrzymuję właściwą wartość w atrybucie z, ale nie w prawidłowej instancji, tej z tą maksymalną wartością.
Oczywiście, mogę również użyć surowych zapytań lub trików z dodatkowymi() i order_by(), ale to naprawdę nie ma sensu dla mnie, że Django idzie do samego końca, aby wesprzeć zagregowane zapytania w miły sposób, ale nie może obsługiwać wyrażeń nawet z własnymi wyrażeniami F.
Czy jest jakikolwiek sposób to zrobić?
Możesz być zainteresowany, aby wiedzieć, że umiejętność korzystania 'F()' obiekty agregatów jest [częścią nadchodzącego Django 1.8 Release] (https://code.djangoproject.com/ wiki/Version1.8Roadmap). –