Django select_related () para multi-consulta de combinación utilizando el modelo y filtros
-
21-08-2019 - |
Pregunta
Tengo dos modelos: Trabajo y Ubicación:
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 a decir: Tengo EEUU / California / San-Francisco, EEUU / California / San_Jose, Estados Unidos / California / Alameda y de los EEUU / California / Oakland en mi base de datos. También tengo Gerente / Ebay / San-Fran, Contador / Amazonas / San-José, Coop / IBM / Oakland Director / Dell / Alameda.
También:.-San Fran tiene como big_city, mientras que San José-, Alameda y Oakland tienen San-Fran como su gran ciudad
Ahora hago una consulta como esta cuando alguien está buscando todos los empleos en San-Francisco.
Job.objects.filter(
location__country='US',
location__state='Calif',
location__city='San-Fran').selected_related('Location')
Sin embargo, me gustaría para permitir la búsqueda de la región en la que el usuario puede buscar todos los empleos en San Fran-Región. Esto sería todos los empleos en San-Francisco, Oakland, Alameda y San José-?
Al igual que "Muéstrame todos los puestos de trabajo que tienen su ubicación es de referencia en otros lugares".
¿Esto se llama un doble unirse?
Lo ideal sería que iba a usar-lon-lat radio (ejercicio posterior), pero por ahora yo quiero saber cómo hacerlo con un doble unirse.
Thx.
Vn44ca
Solución
Esta es una consulta que debe hacer lo que quiera:
Job.objects.filter(location__big_city__city='San-Fran', location__big_city__state='Calif', location__big_city__country='USA')
Y, de hecho, Django usa una combinación dos veces en la ubicación de la tabla cuando se ejecuta 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