繁体   English   中英

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

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM