我习惯于编写自己的SQL查询,并且我正在尝试习惯现在看起来如此受欢迎的整个ORM。
以下是查询:
SELECT * FROM routes WHERE route_id IN (
SELECT DISTINCT t.route_id FROM stop_times AS st
LEFT JOIN trips AS t ON st.trip_id=t.trip_id
WHERE stop_id = %s
)
其中%s是整数。
我正在使用Django的默认ORM。什么是最蟒蛇的方式呢?
一些背景信息:我使用的数据库来自GTFS(Google Transit供稿规范)。此查询应该获取通过特定route
的每个stop
的列表,但链接这些的信息位于trips
表中。
这个查询对我来说很好,所以我要问的唯一原因就是学习。
谢谢!
答案 0 :(得分:1)
如果我错了,请纠正我,但我不认为你能以正常的方式用Django ORM做到这一点。
没有子查询支持,如果一个独特的可以帮助你,它将取决于您的数据库。如果您使用的是Postgres,则可以使用此补丁:http://code.djangoproject.com/ticket/6422
查询将是这样的:
Route.objects.filter(stop_time__trips__stop_id=...).distinct('stop_time__route_id')
答案 1 :(得分:1)
如果您拥有相关Models
所使用的内容,那么找出合适的方法可能会更容易一些。
根据您提到的工作规范,我假设以下内容如下:
class Route(models.Model):
#bunch of stuff
pass
class Stop(models.Model):
#bunch of stuff
stop_times = models.ManyToManyField(through=StopTime)
class StopTime(models.Model):
trip = models.ForeignKey(Trip)
stop = models.ForeignKey(Stop)
# bunch of additional meta about this M2M table
pass
class Trip(models.Model):
route = models.ForeignKey(Route)
# bunch of stuff
如果是这样的话......你应该可以做类似
的事情Route.objects.filter(trip__stop__id=my_stop_id)
获取通过给定Route
且主键Stop
等于id
的所有my_stop_id
个对象,我假设它是一个整数,根据您的交。
如果语法稍微偏离我道歉,因为我不需要使用显式额外表来执行多对多关系。如果您必须(或选择)对任何外键或多对多字段使用related_name
参数,也可能需要进行一些调整。