2010-03-11 6 views
7

Ich habe zwei Tabellen, eine „Gesellschaft“ und ein „Mitarbeiter“:Wie wähle ich aus mehreren Tabellen in einer Abfrage mit 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) 

Und ich möchte jeden Mitarbeiter in einer Tabelle aufzulisten, mit der Gesellschaft daneben. Was einfach genug ist, indem man employees = Employee.objects.all() aufruft und in der Template-Schleife durch {{employee.company.name}} ruft.

Das Problem mit diesen Lösungen besteht darin, dass für jedes Element in der Schleife eine neue Abfrage erstellt wird. Also für jeden Mitarbeiter wird es eine Abfrage an das Unternehmen sein, etwas wie folgt aussehen:

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

Stattdessen möchte ich dies zunächst in der gleichen Abfrage machen kommen Sie mit den Mitarbeiter zu bekommen. Etwas wie dieses:

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

Ist das mit dem Django QuerySet möglich? Wenn nicht, gibt es einen Weg, um dieses Problem zu lösen (ohne rohe SQL)? Oder sollte dieses Verhalten ignoriert, zwischengespeichert und als "optimiert" betrachtet werden?

Antwort

22

select_related() Verwendung werden die entsprechenden Attribute vorab füllen:

Employee.objects.select_related() 
+0

Ich habe die Dokumentation oben und unten gelesen, aber es geschafft, diesen Teil total zu vermissen. Vielen Dank! Das war peinlich. – tdolsen

7

denke ich, was Sie suchen für die select_related Methode Ihrer queryset ist. Siehe the doc

select_related()

eine QuerySet zurück, wird automatisch Fremdschlüssel Beziehungen „folgen“, die Auswahl, dass zusätzliche verwandten Objektdaten, wenn es seine Abfrage ausführt. Dies ist ein Leistungsverstärker, die in führt (manchmal viel) größere Abfragen aber bedeutet eine spätere Verwendung von Fremdschlüssel Beziehungen nicht Datenbank benötigen fragt

0

Es ist eine alte Frage, lassen Sie mich ein liefern neue Antwort.

Eigentlich kann man dies tun:

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

dann, Django automatisch Firmen Klasse Lookup und den Firmennamen für Sie.

Verwenden Sie auf der Vorlagenseite {{employee.company__name}}, dann wird der Firmenname korrekt angezeigt.

Verwandte Themen