2010-03-11 82 views
7

Tengo dos tablas, una "compañía" y uno "a los empleados":¿Cómo selecciono de varias tablas en una consulta con Django?

class Company(models.Model): 
    name = models.CharField(max_length=60) 

class Employee(models.Model): 
    name = models.CharField(max_length=60) 
    company = models.ForeignField(Company) 

y quiero enumerar todos los empleados de una mesa, con la Compañía junto a él. Lo cual es bastante simple llamando al employees = Employee.objects.all() y en el bucle de plantilla a través de él y llamando al {{employee.company.name}}.

El problema con esta solución es que se creará una nueva consulta para cada elemento en el ciclo. Así que para cada empleado habrá una consulta a la empresa buscando algo como esto:

SELECT `company`.`id`, `company`.`name` 
FROM `company` 
WHERE `company`.`id` = 1 # This will of course be the employee.company_id 

lugar quisiera hacer esta unión inicialmente en la misma consulta conseguir los empleados. Algo como esto:

SELECT `employee`.`name` AS `name`, 
     `company`.`name` AS `company_name` 
FROM `employee` INNER JOIN `company` ON `employee`.`company_id` = `company`.`id` 

¿Esto es posible con Django QuerySet? Si no, ¿hay alguna manera de solucionar este problema (sin sql en bruto)? ¿O debería ignorarse este comportamiento, almacenarse en caché y considerarse "optimizado"?

Respuesta

22

Usando select_related() va a rellenar previamente los atributos adecuados:

Employee.objects.select_related() 
+0

He leído la documentación arriba y abajo, pero me las arreglé por completo para no ver esta parte. Bueno, muchas gracias! Eso fue embarazoso. – tdolsen

7

supongo que lo que estás buscando es el método select_related de su queryset. Ver the doc

select_related()

Devuelve un QuerySet que automáticamente "seguir" relaciones de clave externa, la selección de ese datos relacionados con el objeto adicional cuando ejecuta su consulta. Este es un refuerzo rendimiento que se traduce en (a veces mucho) más grandes, pero las consultas significa un uso posterior del extranjero-clave relaciones no requerirá base de datos de consulta

0

Se trata de una cuestión de edad, Permítanme ofrecer una nueva respuesta.

En realidad, usted puede hacer esto:

employees = Employee.objects.all().values('id','name','company__name') 

continuación, Django operaciones de búsqueda automática de clase de empresa y encontrar el nombre de la empresa para usted.

en la página de la plantilla, use {{employee.company__name}} y mostrará el nombre de la compañía correctamente.

Cuestiones relacionadas