2012-01-13 49 views
2

假設我有Table_A,並且我想在它們都有的兩個字段school_idtype_id上加入Table_B。在SQL中,這看起來像:加入到除主鍵以外的字段中的另一個表

SELECT whatever 
FROM Table_A 
INNER JOIN Table_B 
ON (Table_A.school_id = Table_B.school_id 
    AND Table_A.type_id = Table_B.type_id) 

據我所知,Django通過在模型中定義的外鍵/主鍵進行連接。因此,如果您要執行A.objects.filter(B__field2="stuff"),那麼除了將Table_B.field2=stuff置於WHERE子句之外,它將隱含加入A.B_id = B.id。有沒有辦法改爲加入我選擇的鍵,就像上面的SQL查詢一樣?

+0

A.B_id = B.id'由於某種原因不正確? – jbindel 2012-01-13 00:30:34

+0

我不想以這種方式限制..即使「Table_A」不是它的子項,我也想允許'Table_A'加入到'Table_B'中 – babonk 2012-01-13 00:32:55

+0

您確定它是最好的(或唯一的)解決你的任務?你能展示你的模型並描述你想要得到的結果嗎? – DrTyrsa 2012-01-13 07:14:09

回答

0

如果它仍然有效表達這個表格:

SELECT whatever FROM Table_A, Table_B WHERE (Table_A.school_id = Table_B.school_id 
    AND Table_A.type_id = Table_B.type_id) 

(這相當於你上面的例子......),那麼就可以通過Django的ORM和extra子句來做到這一點如:

TableA.objects.extra(
    tables=['myapp_tableb',], 
    where=['myapp_tablea.school_id=myapp_tableb.school_id', 
      'myapp_tablea.type_id=myapp_tableb.type_id'] 
) 

我知道有可能是一些各種複雜的連接,你可以在SQL這將不適合這種事情。

醜陋的部分是你必須使用你真正的SQL表名而不是Django模型名,這有點接近原始SQL ......但你確實找回了一個普通的Django QuerySet對象。

相關問題