2010-11-26 67 views
1

那麼這個人是有點古怪來形容了,請多多包涵:)嘗試無碼解釋將沒有多大意義,所以這裏有一個簡單的例子:的Django「CONCAT」查詢設置

class Employee(models.Model): 
    name = models.CharField(max_length=100) 

class Location(models.Model): 
    address = models.CharField(max_length=200) 
    employees = models.ForeignKey(Employee) 

class Company(models.Model): 
    name = models.CharField(max_length=100) 
    locations = models.ForeignKey(Location) 

讓我們假設我們希望通過模板打印特定公司中的每個員工。通常我們會只是這樣做:

{% for location in company.locations.all %} 
    {% for employee in location.employees.all %} 
     {{ employee.name }} <br/> 
    {% endfor %} 
{% endfor %} 

能夠統計出巨大的,但在這種情況下,我想在員工列表的頂部打印出一個頭,如果有任何員工,但是如果離開關閉標題沒有僱員在場。在典型的循環中,我使用forloop.first來表示標題應該顯示,但在這種情況下我不能。如果我在外部循環(位置)中嘗試它,當沒有僱員時,如果我在內部循環(僱員)中嘗試它,我可能會得到一個標題,我只會得到帶有僱員的位置的標題,但是我會得到每個位置一個標題,而不是整個列表的一個標題。

現在,我的這個理想的解決辦法是跳過一步都在一起,並有一些辦法從公司層面遍歷所有員工:

{% for employee in company.employees %}...{% endfor %} 

employees在公司層面實質上是一個級聯爲每個位置設置的員工查詢。我研究過自定義管理器,但我不確定如何在這種情況下使用它們。

希望這是有道理的。感謝您的任何建議!

回答

4

你可以做的查詢(視圖)反過來想獲得公司全體員工的一個查詢集:

employees = Employee.objects.filter(location__company=company) 

這有隻需要一個單一的數據庫命中額外的好處,而不是每個位置一個。

+0

謝謝!在寫完這個問題後大約2分鐘,這實際上發生在我身上,我剛纔一直在向後看我想的問題!另外一個注意事項,在我的例子中,我實際上將它作爲一個函數添加到了我的Model類中,這可以讓我完全按照上面在模板(`company.employees`)中所述的方式調用它。 – Toji 2010-11-26 17:28:31