3

我习惯于编写自己的 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 提要规范)。此查询应该获取route通过特定的每个的列表stop,但是链接这些的信息在trips表中。

这个查询对我来说很好,所以我问的唯一原因是学习。

谢谢!

4

2 回答 2

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的给定的所有对象,根据您的帖子,我假设它是一个整数。Stopidmy_stop_id

如果语法有点偏离,我深表歉意,因为我不需要使用显式的额外表来建立多对多关系。如果您必须(或选择)将related_name参数用于任何外键或多对多字段,则可能还需要进行一些调整。

于 2010-10-29T15:55:55.100 回答
1

如果我错了,请纠正我,但我认为你不能以正常方式使用 Django ORM 做到这一点。

没有子查询支持,并且在正常连接的情况下,如果 distinct 可以帮助您,它将取决于您的数据库。如果您使用的是 Postgres,那么您可以使用此补丁:http ://code.djangoproject.com/ticket/6422

查询将是这样的:

Route.objects.filter(stop_time__trips__stop_id=...).distinct('stop_time__route_id')
于 2010-10-28T04:22:06.593 回答