假设我有Table_A
,并且我希望在Table_B
和school_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查询?
答案 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对象。