Django - 在注释查询集后获取值列表
Django - getting list of values after annotating a queryset
我有一个这样的 Django 代码:
max_id_qs = qs1.values('parent__id').\
annotate(max_id = Max('id'),).\
values_list('max_id', flat = True)
问题是当我在这样的过滤器中使用 max_id_qs
时:
rs = qs2.filter(id__in = max_id_qs)
查询转换为具有以下结构的 MySQL 查询:
select ... from ... where ... and id in (select max(id) from ...)
而预期的结果应该是
select ... from ... where ... and id in [2342, 233, 663, ...]
换句话说,我在 MySQL 查询中得到的是子查询而不是整数列表,这大大减慢了查找速度。令我惊讶的是,我认为 Django 的 values_list
returns 是一个值列表。
所以问题是,我应该如何重写代码以使用整数而不是 id in (select ... from...)
子查询
来实现所需的 MySQL 查询
查询集是惰性的,并且 .values_list 仍然是 returns 查询集对象。要对其进行评估,只需将其转换为列表即可:
rs = qs2.filter(id__in=list(max_id_qs))
我有一个这样的 Django 代码:
max_id_qs = qs1.values('parent__id').\
annotate(max_id = Max('id'),).\
values_list('max_id', flat = True)
问题是当我在这样的过滤器中使用 max_id_qs
时:
rs = qs2.filter(id__in = max_id_qs)
查询转换为具有以下结构的 MySQL 查询:
select ... from ... where ... and id in (select max(id) from ...)
而预期的结果应该是
select ... from ... where ... and id in [2342, 233, 663, ...]
换句话说,我在 MySQL 查询中得到的是子查询而不是整数列表,这大大减慢了查找速度。令我惊讶的是,我认为 Django 的 values_list
returns 是一个值列表。
所以问题是,我应该如何重写代码以使用整数而不是 id in (select ... from...)
子查询
查询集是惰性的,并且 .values_list 仍然是 returns 查询集对象。要对其进行评估,只需将其转换为列表即可:
rs = qs2.filter(id__in=list(max_id_qs))