我该怎么办使用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。什么是做到这一点?
最Python的方式一些背景信息:该DB我使用来自GTFS(谷歌全顺饲料规范)。该查询应该让每一个通过一个特定的route
去stop
的列表,但是信息连接这些是在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)
获取,通过与主键Route
给定Stop
全力以赴id
对象等于my_stop_id
,这我假设是一个整数,按您的帖子。
我道歉,如果语法是有点过了,因为我还没有做使用一个明确的额外的表许多一对多的关系需要。如果你有(或选择)使用related_name
参数对任何外键或许多一对多场,可能还需要一些调整。
其他提示
纠正我,如果我错了,但我不认为你可以在一个正常的方式做到这一点与Django的ORM。
有没有子查询的支持,并与正常参加这将取决于你的数据库上,如果明显可以帮助你。 http://code.djangoproject.com/ticket:如果您使用的是Postgres比你可以用这个补丁做/ 6422
该查询将是这样的:
Route.objects.filter(stop_time__trips__stop_id=...).distinct('stop_time__route_id')
不隶属于 StackOverflow