加入除主键以外的字段上的另一个表

时间:2012-01-13 00:21:34

标签: mysql sql django django-models

假设我有Table_A,并且我希望在Table_Bschool_id这两个字段上加入type_id。在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"),除了将A.B_id = B.id放入Table_B.field2=stuff子句之外,它还会隐含地加入WHERE。有没有办法连接我选择的键,如上面的SQL查询?

1 个答案:

答案 0 :(得分: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对象。