Django聚合和注释行为比较

2024-04-25 04:07:38 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图使用带注释的值来过滤使用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值过滤,而不是按最大值过滤。你知道吗

我错过了什么?从注释和聚合特性来看,我一定有误解。你知道吗


Tags: 对象true目标属性表达式somefiltermax
1条回答
网友
1楼 · 发布于 2024-04-25 04:07:38

由于注释不采用一对多关系中的值,因此相关对象集中的最大值将被注释到与该集相关的对象,因此Max(对于每个对象)只采用一个值some_prop,并附加到queryset中的每个对象;这与直接在some_prop上访问/过滤没有区别:

When an annotate() clause is specified, each object in the QuerySet will be annotated with the specified values.

对于单个表,需要先聚合以获取最大值,然后对该值进行筛选。你知道吗

相关问题 更多 >