Я привык писать свои собственные SQL-запросы, и я пытаюсь привыкнуть ко всему объекту ORM, который кажется таким популярным в наши дни.Как я могу выполнить этот сложный SQL-запрос с помощью Django 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 представляет собой целое число.
Я использую ORM по умолчанию Django. Какой самый питонический способ сделать это?
Некоторая справочная информация: БД, которую я использую, представляет собой спецификацию GTFS (спецификация Google Transit feed). Этот запрос должен получить список из route
, который проходит через конкретный stop
, однако информация, связывающая их, находится в таблице trips
.
Этот запрос отлично подходит для меня, поэтому единственная причина, по которой я прошу, - это учиться.
Спасибо!
Большое спасибо, это очень полезно. У вас есть модели правильно, и я постараюсь выполнить этот запрос в ближайшее время. Еще один вопрос: в чем разница между ForeignKey и ManyToMany? –
'ForeignKeys' предназначены для отношений« один-два-один »и помещаются в« Модель »на стороне« Много ». ManyToManyFields для отношений «многие ко многим»; на самом деле это не так важно, внутренне, из двух связанных с ним моделей, в которые он помещается, поэтому вы обычно помещаете его в ту, где вы, скорее всего, захотите ее отредактировать (например, встроенные формы администратора Django) , Таблица автоматически создается для представления отношения, которое в основном состоит из двух объектов ForeignKey. – desfido
(о, но в этом случае, поскольку есть дополнительные метаданные о взаимоотношениях «многие ко многим», я вместо этого предположил, что вы делаете это вручную, используя «StopTime». Именно поэтому необходимо использовать параметр 'through' для «ManyToManyField». Если вы решили, что дополнительные данные, данные для «StopTime», были посторонними, кроме информации «много-ко-многим», вы могли бы устранить модель «StopTime» и параметр «сквозной». Нормальные соглашения об именах Django то тогда вы называете «ManyToManyField» как «времена» или что-то подобное.) – desfido