【问题标题】:Django - getting list of values after annotating a querysetDjango - 注释查询集后获取值列表
【发布时间】:2018-02-06 23:01:21
【问题描述】:

我有一个这样的 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 返回一个值列表。

那么问题来了,我应该如何重写代码以使用整数而不是id in (select ... from...)子查询来实现所需的MySQL查询

【问题讨论】:

标签: django django-orm


【解决方案1】:

查询集是惰性的,并且 .values_list 仍然返回一个查询集对象。要评估它,只需将其转换为列表:

rs = qs2.filter(id__in=list(max_id_qs))

【讨论】:

    猜你喜欢
    • 2017-08-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-25
    • 1970-01-01
    • 2020-04-29
    • 2020-05-14
    相关资源
    最近更新 更多