Python Django queryset结果的长度在强制为列表时更改

Python Django queryset结果的长度在强制为列表时更改,python,django,django-queryset,Python,Django,Django Queryset,因此,我有一个相当复杂的查询集,它按ISO周汇总数据: >>> MyThing.objects.all().count() 30000 >>> qs = MyThing.objects.all().order_by('date').annotate( dw=DateWeek('date'), # uses WEEK function dy=ExtractYear('date') ).values( 'dy','dw','group_i

因此,我有一个相当复杂的查询集,它按ISO周汇总数据:

>>> MyThing.objects.all().count()
30000

>>> qs = MyThing.objects.all().order_by('date').annotate(
    dw=DateWeek('date'), # uses WEEK function
    dy=ExtractYear('date')
).values(
    'dy','dw','group_id'
).annotate(
    sum_count=Sum('count')
).values_list('dw', 'dy', 'group_id', 'sum_count')

>>> qs.count()
2000
到目前为止还不错。问题是当我强制将此查询集放入列表时:

>>> len(list(qs))
30000

为什么会这样?当我
count()
直接读取查询集时,如何获取查询集声称拥有的分组值列表?

要解决此问题,请删除
.order\u by('date')
。虽然输出中没有包含它,但数据库后端仍在每行考虑它,导致行数像那样膨胀

如果要对输出进行排序,请在添加这些注释后,
.order\u by('dy','dw')

您还可以添加一个不带任何参数的
.order\u by()
,以清除以前设置的任何排序,例如从模型类定义默认排序


为什么会将长度从30000更改为2000?2000是group_by之后输出的预期长度,但是由于订单中包含了
日期
,因此无法正常工作。我理解。文档中也提到了这一点。请注意,您还可以添加一个空的
order\u by()
,以清除Model.Meta类中的任何排序集。强制列表是什么样子的?你能展示一些物品吗<代码>列表(qs)[:3]