Django select_related () para multi-consulta de junção usando modelo e filtros
-
21-08-2019 - |
Pergunta
Eu tenho dois modelos: Trabalho e local:
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')
digamos Vamos: Eu tenho EUA / Califórnia / San-Fran, EUA / Califórnia / San_Jose, EUA / Califórnia / Alameda & EUA / Califórnia / Oakland no meu banco de dados. Eu também tenho Gestor / Ebay / San-Fran, Contador / Amazon / San-Jose, Coop / IBM / Oakland & Director / Dell / Alameda.
Além disso:. San-Fran tem-se como big_city, enquanto San-Jose, Alameda e Oakland têm San-Fran como seu grande cidade
Agora eu faço uma consulta como esta quando alguém está à procura de todos os postos de trabalho em San-Fran.
Job.objects.filter(
location__country='US',
location__state='Calif',
location__city='San-Fran').selected_related('Location')
No entanto, eu gostaria de permitir a pesquisa por região onde o usuário pode procurar por todos os postos de trabalho em San-Fran Região. Isso seria todos os postos de trabalho em San-Fran, Oakland, Alameda e San-Jose?
Como "Mostre-me todos os trabalhos que têm a sua localização é referência por outros locais".
Será que isso é chamado de duplo participar?
Idealmente, eu estaria usando lat-lon-raio (exercício mais tarde), mas por agora eu quero saber como fazê-lo com participar de um casal.
Thx.
Vn44ca
Solução
Aqui está uma consulta que deve fazer o que quiser:
Job.objects.filter(location__big_city__city='San-Fran', location__big_city__state='Calif', location__big_city__country='USA')
E, de fato, o Django usa uma junção duas vezes na mesa de Localização ao executar esta consulta:
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