【发布时间】:2017-07-18 09:03:03
【问题描述】:
我试图使用带注释的值来过滤使用 F 表达式的查询集,但事实证明它的行为不符合我的预期。
我正在尝试从查询集 qs 中过滤对象,其属性 some_prop 是该查询集的最大值。例如:
set(qs.values_list('some_prop', flat=True))
会输出:
set([1, 3, 5, 7, 9])
我的目标是按值 9 过滤 qs,这是最大值。我可以使用聚合轻松实现:
max_prop = qs.aggregate(max_prop=Max('some_prop'))['max_prop']
qs.filter(some_prop=max_prop)
但我想将这种行为浓缩在一个查询中,所以我使用了注解而不是聚合:
qs.annotate(max_prop=Max('some_prop')).filter(some_prop=F('max_prop'))
但是,这并没有表现出相同的行为。这实际上只是按所有 some_prop 值而不是最大值进行过滤。
我错过了什么?注释和聚合功能一定是我误解了一些东西。
【问题讨论】: