You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Django中如何无需循环提取列表中同一键的所有值?

从Django QuerySet提取同一键值的高效方法

当然有不用手动写循环的更优雅高效的方式,分两种场景来说:

1. 直接从数据库查询时提取(最优方案)

如果你还没执行values()查询,完全可以用Django ORM自带的values_list()方法,直接在数据库层面只获取id字段,这是性能最好的方式:

user_ids = User.objects.values_list('id', flat=True)
# 转成列表的话直接用list()
user_ids_list = list(user_ids)  # 得到 [1,2,3]

这里的flat=True很关键:默认values_list()会返回包含元组的QuerySet(比如[(1,), (2,), (3,)]),加上flat=True后就会直接返回单个值的可迭代对象,非常适合提取单个字段的所有值。

2. 已有values()结果时提取

如果已经有了你示例中的users QuerySet(或列表),用列表推导式是最简洁高效的写法——虽然底层也是循环,但Python对列表推导式做了内部优化,比手动写for循环加extend/append要快得多,代码也更简洁:

user_ids = [user['id'] for user in users]

为什么不推荐手动循环?

手动写循环比如:

user_ids = []
for user in users:
    user_ids.append(user['id'])

虽然能实现功能,但代码冗余,而且性能不如列表推导式,更不用说直接用values_list()从数据库层面优化了。

总结一下:能在ORM层面解决的就用values_list(),这是最高效的;如果已经拿到了数据,用列表推导式是最优选择。

内容的提问来源于stack exchange,提问作者Tsuna

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.29 06:50:26