如何过滤PartUse QuerySet,获取自身或关联PartReturn中imported=False的实例?
实现PartUse实例的过滤需求
你需要筛选出自身imported为False,或者关联的PartReturn实例中存在imported为False的PartUse对象,最佳实现方式是结合Django的Q对象和Exists子查询,既保证逻辑准确又能避免重复结果:
from django.db.models import Q, Exists, OuterRef from django.views.generic.list import ListView class PartUse(models.Model): # 原有字段 imported = models.BooleanField() class PartReturn(models.Model): partuse = models.ForeignKey(PartUse, related_name='partreturns') # 建议显式指定related_name方便引用 # 原有字段 imported = models.BooleanField() class PartUseListView(ListView): model = PartUse def get_queryset(self): if self.request.GET.get('show_imported'): return self.model.objects.all() # 核心过滤逻辑 return self.model.objects.filter( Q(imported=False) | Exists(PartReturn.objects.filter(partuse=OuterRef('pk'), imported=False)) )
逻辑说明:
Q(imported=False):直接匹配自身imported字段为False的PartUse实例Exists(...):子查询判断当前PartUse是否存在至少一个关联的PartReturn实例,且该PartReturn的imported为False- 用
|连接两个条件,实现逻辑或的需求
为什么用Exists而不是直接partreturn__imported=False?
如果直接使用filter(partreturn__imported=False),当一个PartUse关联多个符合条件的PartReturn时,查询结果会返回重复的PartUse实例,需要额外加.distinct()去重。而Exists子查询只会判断是否存在满足条件的关联对象,不会产生重复结果,性能更优。
内容的提问来源于stack exchange,提问作者Viktor
相关产品推荐
相关产品推荐

