使用来自一个django模型的对象过滤来自另一个django对象的对象

iibxawm4  于 2023-03-09  发布在  Go
关注(0)|答案(2)|浏览(133)

我在做我的研究项目。我有两个模型:

class RoutePoint(geo_models.Model):
    vehicle = models.ForeignKey(Vehicle, on_delete=models.CASCADE, null=False, blank=False,
                                related_name='routepoints')
    point = geo_models.PointField()
    datetime = models.DateTimeField()

class Travel(models.Model):
    vehicle = models.ForeignKey(Vehicle, on_delete=models.DO_NOTHING, null=False, blank=False,
                                related_name='travels')
    begin = models.DateTimeField()
    end = models.DateTimeField()

第一个包含车辆的地理位置和车辆到达那里的日期和时间。第二个包含车辆乘坐的开始和结束。
我有一个curl请求,它有两个字段-start_dateend_date,我们称之为某种报告请求。
所以,首先我需要得到这样的东西:

SELECT vehicle_id, begin, end
FROM park_travel
WHERE begin > "2022-12-30" AND end < "2023-01-06"

我将它命名为result
在那之后,我需要得到这样的东西:

SELECT vehicle_id, point, datetime
FROM park_routepoint
WHERE vehicle_id = result.vehicle_id
  AND datetime > result.begin
  AND datetime < result.end

而且我必须在没有原始sql的情况下完成...

kiz8lqtg

kiz8lqtg1#

您可以使用双下划线表示法和F表达式在一个查询中执行此操作:

from django.db.models import F

route_points = RoutePoint.objects.filter(
    vehicle__travel__begin__lt=F("datetime"),
    vehicle__travel__end__gt=F("datetime")
)

然后简单地迭代route_points查询集:

for route_point in route_points:
    print(route_point.vehicle, route_point.point, route_point.datetime)
wvt8vs2t

wvt8vs2t2#

您可以过滤Travel查询集:

start_date = '2022-12-30'
end_date = '2023-01-06'
travel_qs = Travel.objects.filter(begin__gt=start_date, 
end__lt=end_date).values('vehicle_id', 'begin', 'end')

现在您可以使用travel_qsRoutePoint检索点:

route_point_qs = RoutePoint.objects.filter(vehicle_id__in=travel_qs.values('vehicle_id'),
                                        datetime__gt=travel_qs.values('begin'),
                                        datetime__lt=travel_qs.values('end')).values('vehicle_id', 'point', 'datetime')

相关问题