如何基于数组内对象过滤QuerySet,仅保留数组中存在的对应元素
解决方案
方法1:数据库层面过滤(推荐,性能最优)
这种方法直接在SQL查询阶段完成过滤,不需要把全部QuerySet对象加载到内存,适合大部分场景:
- 先提取过滤数组中所有对象的主键列表
arr_pks = [obj.pk for obj in arr] - 用Django ORM的
__in查询过滤原QuerySetfiltered_qs = original_qs.filter(pk__in=arr_pks)
提示:如果需要最终结果和
arr的元素顺序完全一致,可以配合in_bulk实现顺序对齐:obj_map = original_qs.in_bulk(arr_pks) ordered_filtered_list = [obj_map[pk] for pk in arr_pks]
方法2:内存层面过滤(仅适合小数据集)
如果你的原QuerySet已经完成数据库查询、全部对象都加载到内存中,可以直接用列表推导式过滤:
# 先把QuerySet转为普通列表再匹配 filtered_list = [obj for obj in list(original_qs) if obj in arr]
内容的提问来源于stack exchange,提问作者Yorbjörn
相关产品推荐
相关产品推荐

