Django select_related () для многопользовательского запроса с использованием модели и фильтров - PullRequest
1 голос
/ 10 мая 2009

У меня есть две модели: Работа и местоположение:

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')

Скажем так: У меня в базе данных есть США / Калифорния / Сан-Фран, США / Калифорния / Сан-Хосе, США / Калифорния / Аламеда и США / Калифорния / Окленд. У меня также есть менеджер / Ebay / San-Fran, бухгалтер / Amazon / San-Jose, Coop / IBM / Oakland & Director / Dell / Alameda.

Также: Сан-Фран имеет большой город, а Сан-Хосе, Аламеда и Окленд имеют Сан-Фран в качестве своего большого города.

Теперь я делаю такой запрос, когда кто-то ищет все вакансии в Сан-Фран.

Job.objects.filter(
location__country='US', 
location__state='Calif', 
location__city='San-Fran').selected_related('Location')

Однако я хотел бы разрешить поиск по регионам, где пользователь может искать все вакансии в регионе Сан-Фран. Это все работы в Сан-Фран, Окленде, Аламеде и Сан-Хосе?

Как и "Показать мне все задания, ссылки на которые есть в других местах".

Можно ли назвать это двойным соединением?

В идеале я бы использовал lat-lon-radius (более позднее упражнение), но сейчас я хочу знать, как сделать это с двойным соединением.

Thx.

Vn44ca

1 Ответ

1 голос
/ 10 мая 2009

Вот запрос, который должен делать то, что вы хотите:

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...