2013-03-08 56 views
0

我有兩個Django模型並且都沒有關係的對方,但有JID共同(我還沒有做出它的外鍵):是什麼在Django相當於ORM查詢SQL連接

class result(models.Model): 
    rid = models.IntegerField(primary_key=True, db_column='RID') 
    jid = models.IntegerField(null=True, db_column='JID', blank=True) 
    test_case = models.CharField(max_length=135, blank=True) 

class job(models.Model): 
    jid = models.IntegerField(primary_key = True, db_column='JID') 
    client_build = models.IntegerField(max_length=135,null=True, blank=True) 

我要實現這個ORM SQL查詢: SELECT * FROM 結果 JOIN工作 ON job.JID = result.JID

基本上我要加入兩個表,然後執行該表的篩選查詢。

我是ORM和Django的新手。

回答

0

我不知道該怎麼做,在Django的ORM,但這裏有我的2美分:

  • 任何ORM使您的查詢超級容易寫(沒有任何SQL)的99%。剩下1%,你有2個選擇:理解ORM的核心並添加自定義代碼,或者直接編寫純SQL。我建議你爲它編寫SQL查詢。

  • 如果兩個表結果工作有JID,你爲什麼不使它成爲一個外鍵?我覺得很奇怪。

  • 類名以大寫開始,類* - [R * esult,類* Ĵ * OB。

+0

我把JID作爲外鍵。現在有沒有辦法創建查詢? – swe 2013-03-08 02:16:31

3
jobs = job.objects.filter(jid__in=result.objects.values('jid').distinct() 
    ).select_related() 
+0

jid = 1只會給我1個值。此外,我無法從結果表訪問值。但是,你能告訴我如何獲得所有應該是jid =的值嗎? – swe 2013-03-08 02:11:19

+0

只需爲結果創建另一個篩選器並等於在jid中的結果,如jid__in = result – catherine 2013-03-08 02:17:51

+0

如何訪問結果表值。因爲我只能訪問作業表值。是否有可能jobs.test_case(test_case在結果表中) – swe 2013-03-08 02:42:23

0

您可以通過修改這樣表示Django模型外鍵你結果類:

class result(models.Model): 
    rid = models.IntegerField(primary_key=True, db_column='RID') 
    # jid = models.IntegerField(null=True, db_column='JID', blank=True) 
    job = models.ForeignKey(job, db_column='JID', blank=True, null=True, related_name="results") 
    test_case = models.CharField(max_length=135, blank=True) 

(我讀的地方,你需要添加兩個blank=Truenull=True使在Django中可選的外鍵,你可以嘗試不同的選項)。

現在,你可以簡單地寫訪問結果的工作:

myresult.job # assuming myresult is an instance of class result 

隨着參數related_name="results",一個新的領域將自動被Django添加到類job,這樣你就可以寫:

myjob.results 

並獲得工作結果myjob。它並不意味着它必須由Django ORM通過JOIN查詢(它可能會是另一個查詢)來獲取,但是從代碼的角度來看(除了性能考慮因素),效果將是相同的。

你可以在Django documentation找到更多關於models.ForeignKey的信息。