Django中如何用prefetch_related实现多条件反向外键过滤并筛除空关联分组
Django查询优化方案
问题原因
原查询仅过滤了预加载的关联成员数据,未过滤主表GroupModel的返回结果,因此会返回全部分组,仅无符合条件成员的分组的members字段为空数组。
推荐实现方式
使用Exists子查询先筛选出存在符合条件成员的分组,再配合Prefetch预加载对应成员,该方式无重复数据问题,查询效率更高:
from django.db.models import Exists, OuterRef # 定义符合条件的成员查询子集 qualified_member_query = MemberModel.objects.filter( group=OuterRef("pk"), isActive=False, country="CN" ) queryset = GroupModel.objects.filter( # 过滤仅保留存在符合条件成员的分组 Exists(qualified_member_query) ).prefetch_related( # 预加载对应分组下符合条件的成员 Prefetch("members", queryset=MemberModel.objects.filter(isActive=False, country="CN")) ).distinct()
替代实现方式
也可以通过跨关联关系过滤主表,需要注意必须加distinct()避免分组数据重复:
queryset = GroupModel.objects.filter( members__isActive=False, members__country="CN" ).prefetch_related( Prefetch("members", queryset=MemberModel.objects.filter(isActive=False, country="CN")) ).distinct()
内容的提问来源于stack exchange,提问作者greatshieh
相关产品推荐
相关产品推荐

