我有一個模型XYZ,我需要爲給定的查詢集獲取字段a,b和表達式x/y的最大值。Django使用表達式聚合查詢
它的作品非常適合領域。例如:
>>> 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
的一個黑客,我發現這樣做是:
XYZ.all().extra(select={'z':'MAX(x/y)'})[0].z
哪些實際工作,因爲它產生正確的SQL,但它很混亂,因爲我確實在z atttribute處獲得了正確的值,但卻不是正確的實例,即具有最大值的那個。
當然,我也可以用extra()和order_by()來使用原始查詢或技巧,但對於我來說Django以一種很好的方式支持聚合查詢的方式確實沒有意義,但即使使用自己的F表達式也不能支持表達式。
有沒有辦法做到這一點?
你可能有興趣知道,能夠使用'F()'在聚集的對象是[即將Django的1.8版本的一部分(https://code.djangoproject.com/維基/ Version1.8Roadmap)。 – 2015-02-16 04:34:48