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を使用しています。これを行うための最もPython的な方法は何ですか?

いくつかの背景情報:私が使用しているDBは、GTFS(Google Transit Feed仕様)のものです。このクエリはroute、特定を通過するすべてのリストを取得することになっていますがstop、これらをリンクする情報はtripsテーブルにあります。

このクエリは私にとっては問題なく機能するので、私が求めている唯一の理由は学ぶことです。

ありがとう!

4

2 に答える 2

1

私が間違っている場合は訂正してください。ただし、DjangoORMでは通常の方法でそれを行うことはできないと思います。

サブクエリのサポートはありません。通常の結合では、個別の結合が役立つかどうかはデータベースに依存します。このパッチで使用できるよりも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 に答える
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 に答える