我试图使用带注释的值来过滤使用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
值过滤,而不是按最大值过滤。你知道吗
我错过了什么?从注释和聚合特性来看,我一定有误解。你知道吗
由于注释不采用一对多关系中的值,因此相关对象集中的最大值将被注释到与该集相关的对象,因此
Max
(对于每个对象)只采用一个值some_prop
,并附加到queryset中的每个对象;这与直接在some_prop
上访问/过滤没有区别:对于单个表,需要先聚合以获取最大值,然后对该值进行筛选。你知道吗
相关问题 更多 >
编程相关推荐