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 值被计算一次。
这是来自的后续问题:
我的问题:
在 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 值被计算一次。