2010-03-11 119 views
7

我有兩個表,一個「公司」和一個「僱員」:如何使用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) 

我想列出表中的每一位員工,在公司旁邊。通過調用employees = Employee.objects.all()並在模板循環中調用{{employee.company.name}},這很簡單。

這個解決方案的問題是它將爲循環中的每個項目創建一個新的查詢。因此,爲每個員工都會有一個查詢公司看起來像這樣:

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

相反,我希望把它作爲最初加入同一個查詢得到員工。類似這樣的:

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

Django QuerySet可以嗎?如果沒有,是否有辦法解決這個問題(沒有原始的sql)?或者應該忽略這種行爲,緩存並考慮「優化」?

回答

22

使用select_related()將預填充相應的屬性:

Employee.objects.select_related() 
+0

我已經閱讀了文件的上下,但設法完全錯過了這部分。非常感謝!那很尷尬。 – tdolsen 2010-03-11 14:26:47

7

我想你要找的是什麼你的查詢集的select_related方法。 見the doc

select_related()

返回一個QuerySet會 自動「跟隨」外鍵關係 ,選擇當它 執行其查詢 其他相關對象數據。這是一個 業績助推器導致 (有時很)放大查詢,但 意味着以後使用外鍵 關係,不需要數據庫查詢

0

這是一個老問題,讓我提供新的答案。

其實,你可以這樣做:

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

然後,Django會自動查找公司類,併爲您找到的公司名稱。

在模板頁面上使用{{employee.company__name}},那麼它將正確顯示公司名稱。

相關問題