【问题标题】:Full outer join in djangodjango中的完全外连接
【发布时间】:2010-09-20 03:49:45
【问题描述】:

如何使用 django QuerySet API 为跨 M2M 关系芯片的完全外部联接创建查询?

它不受支持,欢迎提供一些关于创建我自己的经理来执行此操作的提示。

编辑添加: @S.洛特: 谢谢开导。 对 OUTER JOIN 的需求来自应用程序。它必须生成一个显示输入数据的报告,即使它仍然不完整。 我不知道结果将是一个新的类/模型。你的提示会对我有很大帮助。

【问题讨论】:

    标签: sql django outer-join


    【解决方案1】:

    Django 不支持通常 SQL 意义上的“连接”——它支持对象导航。

    请注意,关系连接(内部或外部)会创建一个新的实体“类”。一个在 Django 中没有定义的。所以没有适当的“结果集”,因为你返回的东西没有类定义。您可以做的最好的事情是定义一个元组,它将与 None 一起用于缺少的组合。

    左(或右)外连接看起来像这样。它创建了两个不相交的子集,一个有一组相关实体,另一个没有。

    for obj in Model1.objects.all():
        if obj.model2_set().count() == 0:
            # process (obj, None) -- no Model2 association
        else:
            for obj2 in obj.model2_set.all():
                # process (obj, obj2) -- the "inner join" result
    

    “完全”外连接是没有关系的剩余项的联合。

    for obj2 in Model2.objects.all():
        if obj2.model1_set().count() == 0:
            # process (None, obj2) -- no Model1 association
    

    问题始终是,你对这个由三个不同对象子集组成的奇怪集合做了什么处理?

    对象数据库的重点是将处理集中在对象及其关联对象上。

    称为“关系连接”的特殊集合从未出现在原始对象模型中。它是由两个(或更多)原始对象构建的一类新对象。

    更糟糕的是,外连接会创建一个包含多个子类(内连接、左外连接和右外连接)的集合。这些东西的集合是什么意思

    等等,情况可能会变得更糟。如果处理包括对缺失属性的检查(即if someObj.anObj2attribute is None:我们本质上是在寻找没有Model2 关联对象的Model1 项目。嗯......为什么我们将它们放在外部连接中,只是为了过滤他们使用if 语句?为什么不只做单独的查询并正确处理每个子集?


    编辑:当您显示“不完整”状态时,它根本不是外连接。这要简单得多。您需要在视图函数中创建一个(或两个)单独的集合以供您的模板显示。

    首先,您应该使用状态码,而不是外键的存在与否。可选的外键没有“原因”——它们要么存在要么不存在。状态码可以提供有用的含义(“不完整”、“错误”、“损坏”、“不适用”、“要删除”等)

    errorList1 = Model1.objects.filter( status="Incomplete" )
    errorList2 = Model2.objects.filter( status="Incomplete" )
    

    这两个是完全外连接的两个非连接部分。然后,您可以在模板中显示这两个错误列表以及相应的列标题和状态代码以及所有内容。

    您甚至可以将它们放在一个表中,以模仿人们过去常常看到的旧的完整外连接报告

    <table>
        <tr><th>Model1</th><th>Model2</th></tr>
        {% for e1 in errorList1 %}
        <tr><td>e1</td><td>NULL</td></tr>
        {% endfor %}
        {% for e2 in errorList2 %}
        <tr><td>NULL</td><td>e2</td></tr>
        {% endfor %}
    </table>
    

    看起来像一个完整的外部连接报告。没有完整的外部连接。

    【讨论】:

    • 你是对的。我将编写一个视图,在 python 中为我的“FULL OUTER JOIN”计算必要的表,然后将结果交给模板进行渲染。谢谢。
    • 我正在查看这个并发现有趣的是,因为我们正在过渡到不同的架构,我们实际上有一个用例,并且得到的结果仅限于任一架构和那些是当前存在于两者中的数据点。因此,仅仅因为您不会从头开始设计它并不意味着用例不会在现实生活中出现。
    【解决方案2】:

    Colin,我的同事之一,不久前写了一篇关于在 Django 中进行自定义连接的帖子:

    http://www.caktusgroup.com/blog/2009/09/28/custom-joins-with-djangos-queryjoin/

    你也许可以在那里找到有用的东西!

    【讨论】:

      猜你喜欢
      • 2018-10-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-01-06
      • 2013-03-11
      • 2022-01-01
      • 2022-01-16
      相关资源
      最近更新 更多