Django如何从子模型User查询集获取父模型Department查询集
解决方案
你可以基于已有的活跃用户查询集,通过子查询的方式直接拿到部门实例查询集,不需要重复编写过滤逻辑,也不会返回字典结构:
- 先从活跃用户查询集中提取所有关联的部门ID,去重后作为过滤条件
# 假设你已有的活跃用户查询集为 active_user_queryset dept_ids = active_user_queryset.values_list("department_id", flat=True).distinct()
- 用ID过滤部门表,拿到部门实例查询集
target_departments = Department.objects.filter(id__in=dept_ids)
方案说明
- 以上写法Django会自动优化为单次SQL查询(子查询形式),不会把所有ID加载到Python内存中,性能和直接写关联过滤一致
- 最终得到的
target_departments是标准的Department模型实例查询集,支持后续继续链式调用filter()、annotate()、order_by()等所有查询集方法 - 加
distinct()是为了避免同一个部门对应多个活跃用户时出现重复ID,减少子查询的数据量
你之前用values()得到字典是因为values()默认返回键值对结构,而values_list搭配flat=True在仅取单个字段时会返回单值序列,刚好适配__in查询的参数要求。
内容的提问来源于stack exchange,提问作者Luiz F. Bianchi
相关产品推荐
相关产品推荐

