Django select_related() для запроса с несколькими соединениями с использованием модели и фильтров
-
21-08-2019 - |
Вопрос
У меня есть две Модели:Работа и местоположение:
class Job(models.Model):
title = models.CharField(max_length=20)
company = models.CharField(max_length=20)
location = ForeignKey('Location')
class Location(models.Model):
country = models.CharField(max_length=20)
state = models.CharField(max_length=20)
city = models.CharField(max_length=20)
latitude = models.FloatField(blank=True, default=0.0)
longitude = models.FloatField(blank=True, default=0.0)
big-city = ForeignKey('Location')
Допустим,:В моей базе данных есть США / Калифорния / Сан-Франциско, США / Калифорния / San_Jose, США / Калифорния / Аламеда и США / Калифорния / Окленд.У меня также есть менеджер / Ebay / Сан-Франциско, Бухгалтер / Amazon / Сан-Хосе, Кооператив / IBM / Окленд и директор / Dell / Аламеда.
Также:Сан-Фран сам по себе является big_city, в то время как Сан-Хосе, Аламеда и Окленд считают Сан-Фран своим большим городом.
Теперь я делаю подобный запрос, когда кто-то ищет все вакансии в Сан-Франциско.
Job.objects.filter(
location__country='US',
location__state='Calif',
location__city='San-Fran').selected_related('Location')
Однако я хотел бы разрешить поиск по регионам, где пользователь может искать все вакансии в регионе Сан-Франциско.Это будут все рабочие места в Сан-Франциско, Окленде, Аламеде и Сан-Хосе?
Например, "Покажите мне все задания, местоположение которых указано в других местоположениях".
Будет ли это называться двойным соединением?
В идеале я бы использовал lat-lon-radius (последующее упражнение), но сейчас я хочу знать, как это сделать с помощью двойного соединения.
Спасибо.
Вн44ка
Решение
Вот запрос, который должен делать то, что вы хотите:
Job.objects.filter(location__big_city__city='San-Fran', location__big_city__state='Calif', location__big_city__country='USA')
И действительно, Django дважды использует соединение в таблице Location при выполнении этого запроса:
SELECT "example_job"."id", "example_job"."title", "example_job"."company", "example_job"."location_id" FROM "example_job" INNER JOIN "example_location" ON ("example_job"."location_id" = "example_location"."id") INNER JOIN "example_location" T3 ON ("example_location"."big_city_id" = T3."id") WHERE (T3."country" = USA AND T3."city" = San-Fran AND T3."state" = Calif