【问题标题】:Joining to another table on fields other than its primary key在主键以外的字段上加入另一个表
【发布时间】:2012-02-09 06:54:00
【问题描述】:

假设我有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 查询一样?

【问题讨论】:

  • A.B_id=B.id 是否因某种原因不正确?
  • 我不想以这种方式限制它。我想让Table_A 加入Table_B,即使Table_A 不是它的孩子
  • 您确定这是解决任务的最佳(或唯一)方法吗?你能展示你的模型并描述你想要得到的结果吗?

标签: mysql sql django django-models


【解决方案1】:

如果以这种形式表达您的查询仍然有效:

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 对象。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多