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
相关产品推荐
相关产品推荐

