【问题标题】:Django double join via multiple modelsDjango 通过多个模型进行双重连接
【发布时间】:2011-05-26 14:33:29
【问题描述】:

情况

我有 3 个模型。 A型、B型和C型。

class A(Model):
    B_id = ForeignKey(B)
    id = IntegerField()
    pub_date = DateField()

class B(Model):
    id = IntegerField(primary_key = True)

class C(Model):
    B_id = ForeignKey(B)
    pub_date = DateField()
    information = TextField()

模型 A 和模型 C 都有一个名为 B_id 的字段,它是模型 B 的外键。因此从 B 到 A 或 C 没有直接连接。

目标

我从模型 A 获得了一个 ID。现在我需要来自 C 的所有信息,其中 pub_date 与 A 中的 pub_date 匹配,B_id 与 A 中的 B_id 匹配。

在 SQL 中,这将是一个非常简单的查询:

SELECT C.information FROM A JOIN C USING(B_id, pub_date) WHERE A.id = 1234;

但我根本不知道如何在 Django ORM 语法中执行此操作,因为 filter()-clause 仅在存在从 C 到 A 的直接连接路径时才有效。

--

编辑:请注意,A 中有不止一行与一个 id 匹配。

【问题讨论】:

    标签: django orm django-models


    【解决方案1】:

    编辑:

    试试这个:

     A.objects.filter(B_id__c__pub_date=F('pub_date'))
    

    我不是 100% 确定过滤器字符串的大小写,但 F() 谓词是您要查找的。见the docs

    【讨论】:

    • 很抱歉之前没有提及,但是 A 中有不止一行与一个 id 匹配(我更新了问题以反映这一事实)。起初我尝试获取所有 A 对象并使用__in= 过滤条件,但它不会成对进行比较,我可能会得到比预期更多的结果。
    • @Danilo 查看您的加入声明很有意义。我刚刚看到“我获得了一个 ID”。查看我的更新。
    • 酷,谢谢 :) 我不得不稍微更改一下查询,但以下方式似乎可以工作:C.objects.filter(B_id__A__id=1234, B_id__A__pub_date=F('pub_date')。生成的原始 SQL 看起来也不错,即使进行了不必要的内部连接。但这不会造成任何伤害:)
    • 编辑:对不起,我删除了关于查询不起作用的最后评论。它工作得很好,这是我的数据库的问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-10-25
    • 2019-08-13
    • 1970-01-01
    • 1970-01-01
    • 2012-07-03
    • 2013-09-30
    • 2011-06-16
    相关资源
    最近更新 更多