我已经习惯了写我自己的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(谷歌全顺饲料规范)。该查询应该让每一个通过一个特定的routestop的列表,但是信息连接这些是在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')
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top