如何不使用循环从ID列表获取含重复项的Queryset?
解决Django中按含重复项的ID列表保留重复结果查询的问题
Django的id__in查询会自动去重,没法保留原ID列表里的重复项,想要高效实现需求可以这么做:
- 先一次性查出所有唯一ID对应的对象,把它们转成
ID: 对象的字典映射,再遍历原ID列表去字典里取对应对象,这样只需要一次数据库查询,比循环每个ID单独查询高效得多:
id_list = [1,2,3,3,4,1] # 提取唯一ID,缩小查询范围 unique_ids = set(id_list) # 一次查询所有需要的对象,构建ID到对象的映射字典 point_map = {point.id: point for point in Point.objects.filter(id__in=unique_ids)} # 按原列表顺序生成包含重复项的结果列表 result = [point_map[id] for id in id_list]
注意:Django的QuerySet本质对应SQL查询结果,本身不支持重复条目,所以最终结果只能是列表形式。如果原ID列表里可能存在数据库中不存在的ID,可以用point_map.get(id, None)来避免KeyError。
内容的提问来源于stack exchange,提问作者Coder Awan
相关产品推荐
相关产品推荐

