2010-07-23 68 views
3
queryObj = Rating.objects.select_related(
    'Candidate','State','RatingCandidate','Sig','Office','OfficeCandidate').get(
     rating_id = ratingId, 
     ratingcandidate__rating = ratingId, 
     ratingcandidate__rating_candidate_id = \ 
      officecandidate__office_candidate_id) 

這一行給了我一個錯誤。我試圖獲得許多不同的表,通過主鍵和常規ID鏈接。最後的選擇是問題:用django連接表格

ratingcandidate__rating_candidate_id = officecandidate__office_candidate_id. 

我需要跳過來獲取所有數據。

回答

12

我想獲得許多不同的表,通過主鍵和常規ID鏈接。

不要試圖「加入」表。這不是SQL。

你必須做多個獲取從許多不同的表中獲取數據。

不要擔心select_related,直到你可以證明你有一個瓶頸。

只需根據需要從各個類中執行各種GET。

讓我們關注候選人和評級。

class Rating(Model): 
    ... 

class Candidate(Model): 
    rating = Models.ForeignKey(Rating) 

這樣做。

r = Rating.objects.get(id=rating_id) 
c = r.candidate_set.all() 

這將獲得評級和所有具有該評級的候選人。這實際上是一個SQL連接:它是兩次抓取。在Django ORM中,儘可能簡單地編寫兩個提取。讓Django(和你的數據庫)爲你緩存一些東西。

要在模板表單的單行中顯示多個表格的元素,請執行此操作。

在視圖:

r = Rating.objects.get(id=rating_id) 
return render_to_response(some_form, { 'rating':r }) 

在模板:

Rating: {{rating}}. Candidates: {% for c in rating.candidate_set.all %} {{c}} {%endfor%} 

等等

你簡單的 「導航」,在你的模板來顯示所要求的信息的對象之一。

+1

我不包括我需要從值的表中的其餘部分。一旦我創建了所有對象並擁有所有不同的數據,我將如何合併它並將其輸出爲行? – atomical 2010-07-23 16:13:52

+0

如果我有一個表中有多個條目與評估對象的返回值相匹配,那麼獲取整個表並將其放入模板是可以接受的? – atomical 2010-07-23 17:18:25

+0

@atomical:除了獲取多個條目並將其放入模板中,您還能做什麼?你是否**不會顯示多個條目?我不明白這個問題。 – 2010-07-23 17:19:53

1

您不能在表達式的右側使用雙下劃線語法。如果您需要在右側引用字段名稱,使用F()功能:

ratingcandidate__rating_candidate_id = F('officecandidate__office_candidate_id') 
+0

那麼這是一種連接形式嗎? – atomical 2010-07-23 17:22:40

+0

否。這是一個查詢字符串,用於查找與您的所有條件匹配的評分對象。 Django的ORM中沒有「加入」。 – 2010-07-23 17:42:59