[英]How can I do this complex SQL query using Django ORM? (sub-query with a join)
我习惯于编写自己的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
表中。
这个查询对我来说很好,所以我要问的唯一原因就是学习。
谢谢!
如果我错了,请纠正我,但我不认为你可以用正常的方式用Django ORM做到这一点。
没有子查询支持,如果一个独特的可以帮助你,它将取决于你的数据库。 如果你使用的是Postgres,你可以使用这个补丁: http : //code.djangoproject.com/ticket/6422
查询将是这样的:
Route.objects.filter(stop_time__trips__stop_id=...).distinct('stop_time__route_id')
如果您拥有相关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)
获取所有通过给定Stop
Route
对象,其主键id
等于my_stop_id
,我假设它是一个整数,根据你的帖子。
如果语法稍微偏离我道歉,因为我不需要使用显式额外表来执行多对多关系。 如果必须(或选择)对任何外键或多对多字段使用related_name
参数,则可能还需要进行一些调整。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.