django queryset aggregation count 计数错误

django queryset aggregation count counting wrong thing

这是来自的后续问题:

我的问题:

在 Django 中使用聚合计数会计算查询集中错误的内容,或者据我所知甚至不在我的查询集中的内容。

我做了什么 我用过:

queryset.order_by('col1', 'col2').distinct('col1', 'col2').values('col2')

获取模型 col2 的值,其中所有行在 (col1, col2) 中都有一对不同的值。在上面的link中有一个例子。我打印了我的查询集,它看起来不错,我有

[{'col2': value1}, ... , {'col2': value1},{'col2': value2}, ..., {'col2': value2},...]

我现在想计算每个值出现在我得到的查询集中的次数。我使用聚合计数来执行此操作。我有:

a = {'count': Count(F(col2), distinct=False)}
queryset.annotate(**a)

我也用 ``distinct=True` 尝试过,但没有成功

我希望得到 [{col2:value1, count: num1}, {col2:value2, count: num2} ...]
相反,我得到 [{col2: value1, count: num11}, {col2: value1, count: num12}, ... ,{col2: value1, count: num_1n}, {col2: value2, count: num21}, ... ,{col2: value1, count: num_2n}, ...]。 据我所知,num11,....,num_1n 是 col2 中存在的 value1 行的数量,在 col1 中有任何特定值,在我准备查询时使用 order_by('col1', 'col2').distinct('col1', 'col2').values('col2') 之前。

我不知道是什么原因造成的。我试着查看 queryset.query 参数,但我不明白哪里出错了。

如有任何帮助,我们将不胜感激。

.order_by 应该只指定 'col2',例如:

queryset.values('col2').annotate(
    count=Count('col1', distinct=True)
).order_by('col2')

这将因此产生一个 QuerySet 看起来像:

< QuerySet [
    {'col2': 1, 'count': 4 },
    {'col2': 2, 'count': 2 }
]>

所以这意味着 col1 有四个 distinct 值给定 col2 具有值 1,并且 [=2 个不同的值=16=] 给定 col2 的值为 2.

这将构建如下查询:

SELECT col2, COUNT(DISTINCT col1) AS count
FROM some_table
GROUP BY col2
ORDER BY col2

这里的 .distinct(..) 不是 必需的 因为 GROUP BY 我们只会获得不同的 col2 值,并且因为我们 COUNT(DISTINCT ..) 这意味着 col1 的每个 distinct 值被计算一次。