如何在Django中无需原生SQL,用Travel模型过滤RoutePoint模型对象?
解决方案
1. 筛选目标行程记录
从请求中获取start_date和end_date后,先过滤出时间范围内的Travel数据:
start_date = request.GET.get('start_date') # 根据实际请求方式获取参数 end_date = request.GET.get('end_date') target_travels = Travel.objects.filter( begin__gt=start_date, end__lt=end_date )
2. 匹配对应行程的轨迹点
使用Django ORM的Exists子查询,精准筛选属于目标行程车辆、且时间落在对应行程起止区间内的RoutePoint:
from django.db.models import Exists, OuterRef filtered_route_points = RoutePoint.objects.filter( # 确保轨迹点所属车辆存在符合条件的行程 vehicle__travels__in=target_travels, # 确保轨迹点时间落在该车辆某条目标行程的时间区间内 Exists( target_travels.filter( vehicle=OuterRef('vehicle'), begin__lte=OuterRef('datetime'), end__gte=OuterRef('datetime') ) ) )
说明:Exists子查询会为每个RoutePoint校验是否存在对应匹配的Travel记录,既保证车辆归属正确,又避免出现车辆有符合条件的行程,但轨迹点时间不在任何行程区间内的无效数据。
内容的提问来源于stack exchange,提问作者Pavel
相关产品推荐
相关产品推荐

