如何使用Django ORM执行这个复杂的SQL查询? (带连接的子查询)

我习惯于编写自己的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。什么是最pythonic的方式来做到这一点? 一些背景信息:我使用的数据库来自GTFS(Google Transit供稿规范)。这个查询应该得到一个经过特定
stop
的每个
route
的列表,但链接这些的信息在
trips
表中。 这个查询对我来说很好,所以我要问的唯一原因就是学习。 谢谢!     
已邀请:
如果您拥有相关的
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)
通过主键
id
等于
my_stop_id
得到所有经过给定
Stop
Route
对象,我假设你的帖子是一个整数。 如果语法稍微偏离我道歉,因为我不需要使用显式额外表来执行多对多关系。如果您必须(或选择)对任何外键或多对多字段使用
related_name
参数,也可能需要进行一些调整。     
如果我错了,请纠正我,但我不认为你可以用正常的方式用Django ORM做到这一点。 没有子查询支持,如果一个独特的可以帮助你,它将取决于你的数据库。如果你使用的是Postgres,你可以使用这个补丁:http://code.djangoproject.com/ticket/6422 查询将是这样的:
Route.objects.filter(stop_time__trips__stop_id=...).distinct('stop_time__route_id')
    

要回复问题请先登录注册