2010-03-11 12 views
7

Mam dwie tabele, jeden „Spółka” i jeden „pracownika”:Jak wybrać z wielu tabel w jednym zapytaniu z 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) 

I chcę wymienić każdy pracownik w tabeli, ze Spółką obok niego. Co jest dość proste, wywołując employees = Employee.objects.all() oraz w pętli szablonu przez to i wywołując {{employee.company.name}}.

Problem z tymi rozwiązaniami polega na tym, że zostanie utworzone nowe zapytanie dla każdego elementu w pętli. Więc dla każdego pracownika będzie jedno zapytanie do Spółki poszukuje czegoś takiego:

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

Zamiast tego życzę, aby ta dołączyć początkowo w tej samej kwerendy uzyskiwanie pracowników. Coś takiego:

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

Czy to możliwe z Django queryset? Jeśli nie, czy istnieje sposób, w jaki mogę rozwiązać ten problem (bez surowego sql)? Czy powinno to być ignorowane, buforowane i uważane za "zoptymalizowane"?

Odpowiedz

22

Korzystanie select_related() będzie wstępnie wypełnić odpowiednie atrybuty:

Employee.objects.select_related() 
+0

Przeczytałem dokumentację w górę iw dół, ale udało mi się całkowicie pominąć tę część. Cóż, dziękuję bardzo! To było krępujące. – tdolsen

7

Chyba to, czego szukasz jest select_related metoda swojej queryset. Zobacz the doc

select_related()

Zwraca QuerySet która automatycznie „podążać” obcy klucz relacji, wybierając że dodatkowe dane powiązanymi przedmiot gdy wykonuje swoje zapytanie. Jest to wzmacniacz wydajność co skutkuje (czasem znacznie) większe zapytań ale oznacza późniejszego wykorzystania zagranicznych kluczowych relacji nie wymaga bazy danych odpytuje

0

To jest stare pytanie, pozwól mi zapewnić nowa odpowiedź.

Rzeczywiście, można to zrobić:

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

wtedy, Django automatycznie odnośnika klasy Company i znaleźć nazwę firmy dla Ciebie.

na stronie szablonu, użyj {{employee.company__name}}, a następnie wyświetli nazwę firmy poprawnie.

Powiązane problemy