Django如何传入ID列表批量filter查询 单次获取所有关联账号ID
解决方案
你可以直接使用Django ORM内置的__in运算符查询多个匹配值,配合distinct()方法在数据库层面完成去重,全程只发起1次数据库请求,完全避免循环查询的性能损耗,同时保留对原有单个ID入参的兼容性。
修改后代码
from typing import List, Union from project import models def get_followers_ids(system_ids: Union[int, List[int]]) -> List[int]: # 兼容单个ID和ID列表两种入参格式 filter_condition = {} if isinstance(system_ids, list): filter_condition["system_id__id__in"] = system_ids else: filter_condition["system_id__id"] = system_ids return list( models.Mapper.objects.filter(**filter_condition) .values_list("account__id", flat=True) .distinct() )
使用示例
原有单个ID调用(兼容旧逻辑无需修改)
system_id = 12350 utility_ids = get_followers_ids(system_id) print(utility_ids)
输出:
>>> [14338, 14339, 14341, 14343, 14344, 14346, 14347, 14348, 14349, 14350, 14351]
多个ID调用
system_ids = [1, 2] utility_ids = get_followers_ids(system_ids) print(utility_ids)
输出:
>>> [3,4,5,6,7,8]
实现说明
__in运算符会匹配所有system_id__id在传入列表范围内的记录,仅执行1次SQL查询,性能远高于循环多次查询distinct()方法直接在SQL查询阶段对返回的账号ID去重,不需要在Python内存中额外做合并去重操作- 代码做了向下兼容,原有调用单个ID的逻辑不需要调整即可正常运行
内容的提问来源于stack exchange,提问作者The Dan
相关产品推荐
相关产品推荐

