Django如何无需循环过滤无匹配成本中心的UserBooking记录
你可以直接用Django ORM的Exists关联子查询实现需求,全程在数据库层面完成过滤,既不需要循环遍历,还能避免原来写法的N+1查询问题,性能更高。
首先导入依赖:
from django.db.models import Exists, OuterRef, Q
然后直接构造查询即可:
# 构造子查询,匹配当前UserBooking对应的有效成本中心规则 valid_cost_center_subquery = UserCostCenter.objects.filter( user=OuterRef("user"), start_date__lte=OuterRef("date"), Q(end_date__gte=OuterRef("date")) | Q(end_date__isnull=True) ) # 过滤出存在有效成本中心的UserBooking记录,就是你要的结果 queryset = UserBooking.objects.filter(Exists(valid_cost_center_subquery))
逻辑说明:
OuterRef的作用是引用外层UserBooking查询的字段值,这里分别取到每条UserBooking对应的用户、预订日期,和你原循环里逐个取booking.user、booking.date的逻辑完全一致Exists会判断子查询是否存在匹配的记录,返回布尔值,直接过滤掉返回False的记录,就完成了「排除无有效成本中心记录」的需求
如果你使用的是Django 3.0以下的旧版本,Exists需要从django.db.models.expressions导入即可,其他逻辑不变。
内容的提问来源于stack exchange,提问作者kaustubh krishna
相关产品推荐
相关产品推荐

