2010-03-11 7 views
7

J'ai deux tables, une « société » et un « employé »:Comment sélectionner plusieurs tables dans une requête avec 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) 

Et je veux énumérer tous les employés d'une table, avec la Société à côté de lui. Ce qui est assez simple en appelant employees = Employee.objects.all() et dans la boucle de modèle et en appelant {{employee.company.name}}.

Le problème avec cette solution est qu'il sera créé une nouvelle requête pour chaque élément de la boucle. Ainsi, pour chaque employé, il y aura une requête à la recherche entreprise quelque chose comme ceci:

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

Au lieu de cela, je tiens à le faire se joindre d'abord dans la même requête obtenir les employés. Quelque chose comme ceci:

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

Est-ce possible avec le Django QuerySet? Sinon, y a-t-il un moyen de contourner ce problème (sans sql brut)? Ou ce comportement devrait-il être ignoré, mis en cache et considéré comme "optimisé"?

Répondre

22

L'utilisation select_related() sera pré-remplir les attributs appropriés:

Employee.objects.select_related() 
+0

J'ai lu la documentation de haut en bas, mais j'ai raté complètement cette partie. Eh bien merci beaucoup! C'était embarrassant. – tdolsen

7

Je suppose que ce que vous cherchez est la méthode select_related de votre queryset. Voir the doc

select_related()

Renvoie un QuerySet qui automatiquement « suivre » clé étrangère relations, sélection qui données relatives à l'objet supplémentaire quand il exécute sa requête. Ceci est un rappel de la performance qui se traduit par (parfois beaucoup) plus grandes requêtes mais signifie une utilisation ultérieure des -clés étrangères relations ne nécessitera pas la base de données requêtes

0

Il est une vieille question, permettez-moi de fournir un nouvelle réponse

En fait, vous pouvez le faire:

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

puis, Django automatiquement rechercher la classe de l'entreprise et trouver le nom de l'entreprise pour vous.

Sur la page modèle, utilisez {{employee.company__name}}, puis le nom de l'entreprise s'affichera correctement.

Questions connexes