Django select_related () para multi-consulta de junção usando modelo e filtros

votos
1

Eu tenho dois modelos: Trabalho e Localização:

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

Vamos dizer: 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.

Também: 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

Publicado 10/05/2009 em 20:15
fonte usuário
Em outras línguas...                            


1 respostas

votos
1

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
Respondeu 10/05/2009 em 20:48
fonte usuário

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more