【发布时间】:2012-04-30 13:47:40
【问题描述】:
我有一个模型 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
我发现这样做的一个技巧是:
XYZ.all().extra(select={'z':'MAX(x/y)'})[0].z
这确实有效,因为它生成了正确的 SQL,但令人困惑的是,我确实在 z 属性处获得了正确的值,但没有获得正确的实例,即具有该最大值的实例。
当然,我也可以使用带有 extra() 和 order_by() 的原始查询或技巧,但 Django 一直以一种很好的方式支持聚合查询对我来说真的没有意义,但可以'即使有自己的 F 表达式也不支持表达式。
有什么办法吗?
【问题讨论】:
-
您可能有兴趣知道在聚合中使用
F()对象的能力是part of the upcoming Django 1.8 release。
标签: python sql django django-1.3