1

我正在使用tastepie 为我的django 应用程序获取REST API。我的模型包括车站(例如火车站)、路线(例如芝加哥到圣路易斯)和 routedetail,它是多对多关系的中间模型,例如 RouteDetail(station="Springfield-IL", route="CHI-STL ",到达时间=下午 4 点,出发时间=下午 4 点 05 分)

class Station(models.Model):
  name = models.CharField(max_length=10, unique=True)

class Route(models.Model):
  name = models.CharField(max_length=10, unique=True)
  stations = models.ManyToManyField(Station, through='RouteDetail')

class RouteDetail(models.Model):
  station = models.ForeignKey(Station)
  route = models.ForeignKey(Route)
  arrival_time = models.TimeField(blank=True, null=True)
  depart_time = models.TimeField(blank=True, null=True)

我的问题是如何查询从伊利诺伊州林肯到密苏里州圣路易斯的所有路线?现在我在tastepie中做了这样的事情,这很有效,但是有没有办法在一个查询中做到这一点?

from_station = request.GET.get('from', None)
to_station = request.GET.get('to', None)
semi_filtered = super(RouteResource, self).apply_filters(request, applicable_filters)
return semi_filtered.filter(stations__name=from_station).filter(stations__name=to_station)
4

1 回答 1

1

你的模型如何表达从 A 到 B 的路线的存在?在我看来,它似乎没有包含足够的信息来分辨。

我能看到如何执行的最接近的查询是询问是否存在路线 R,使得 A 站在 R 路线上,B 站在 R 路线上,并且 A 站的出发时间在 B 站的到达时间之前。

在 SQL 中,这将是:

SELECT * FROM myapp_route R
 JOIN myapp_routedetail A ON A.station_id = from_station AND A.route_id = R.id
 JOIN myapp_routedetail B ON B.station_id = to_station AND B.route_id = R.id
 WHERE A.depart_time < B.arrival_time;

据我所知,没有办法在 Django 的 ORM 中表达此查询,但您始终可以发出原始 SQL 查询

Route.objects.raw('''
    SELECT * FROM myapp_route R
     JOIN myapp_routedetail A ON A.station_id = %s AND A.route_id = R.id
     JOIN myapp_routedetail B ON B.station_id = %s AND B.route_id = R.id
     WHERE A.depart_time < B.arrival_time
     ''', [from_station.id, to_station.id])

但请注意:该条件A.depart_time < B.arrival_time不适用于在午夜之前开始并在午夜之后结束的路线。

于 2013-03-31T14:10:08.180 回答