Как я могу сделать этот сложный запрос SQL, используя Django Orm? (подпроситель с присоединением)

StackOverflow https://stackoverflow.com/questions/4039711

Вопрос

Я привык писать свои собственные запросы SQL, и я пытаюсь привыкнуть к всей вещи, которая, кажется, настолько популярна.

Вот запрос:

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. Какой самый питонический способ сделать это?

Несколько фоновой информации: БД, которую я использую, от GTFS (спецификация Google Transit Ced). Этот запрос должен получить список всех 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 обычным способом.

Нет поддержки подзапросе, а с обычным присоединением она будет зависеть от вашей базы данных, если отчетливый может помочь вам. Если вы используете Postgres, чем вы можете сделать это с этим патчм: http://code.djangoproject.com/ticket/6422.

Запрос был бы чем-то вроде этого:

Route.objects.filter(stop_time__trips__stop_id=...).distinct('stop_time__route_id')
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top