当前位置: 首页 > 面试题库 >

Django中的完全外部联接

高化
2023-03-14
问题内容

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

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

编辑添加 @ S.Lott:感谢您的启发。应用程序需要使用OUTER
JOIN。即使它仍然不完整,它也必须生成一个报告,显示输入的数据。我不知道结果将是一个新的类/模型。您的提示将对我有很大帮助。


问题答案:

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

请注意,关系联接(内部或外部)会创建一个新的实体“类”。在Django中没有定义的一个。因此,没有适当的“结果集”,因为对于返回的内容没有类定义。您能做的最好的事情就是定义一个元组,对于缺少的组合,将在其中填充无。

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

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:我们本质上是在寻找Model1没有Model2对象关联的项目。嗯……为什么我们将它们放在外部联接中,仅使用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>

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



 类似资料:
  • 问题内容: 我正在尝试编写一个join语句来将以下三个数据集连接在一起。(这是使用MS SQL Server的) 我认为完全可以通过外部联接来做到这一点,但是我遇到了主要的跨产品问题。 问题答案: 试试看:

  • 问题内容: 我有一个网站,用户可以在其中查看电影列表,并为其创建评论。 用户应该能够看到所有电影的列表。此外,如果他们查看了电影,则他们应该能够看到他们给它的评分。如果不是,则仅显示没有得分的电影。 他们根本不在乎其他用户提供的分数。 考虑以下 我本质上想要的是 考虑以下内容: 两个测试都应打印完全相同的输出,但是,只有原始版本会吐出正确的结果表: orm会返回这个 任何试图加入其余主题的尝试,那

  • 问题内容: 根据Google搜索:由于MySQL不支持完全外部联接,因此可以通过union和/或union all模拟它。但是,这两者要么删除正版副本,要么显示伪造副本。 什么是正确有效的方式? 这个问题似乎相关,但无法获得答案。 问题答案: 您可以使用左联接和右联接: 在Wikipedia上也有关于此主题的一些信息:完全外部联接。 维基百科文章建议在MySQL中使用UNION。这比UNION A

  • 问题内容: 我对MySQL中的FULL OUTER JOIN有疑问。我有两个(或更多表): 我已经使用此查询来加入我的行列: 要得到: 我的问题是,我无法同时将两个id列折叠为一列来获取此信息: 有什么建议吗? 问题答案: 采用: 该操作者除去行/记录重复的,所以你必须列适当地定义/列表。 脚本: 编辑:上面的固定线

  • 问题内容: 我使用FULL OUTER JOIN联接了2个表,这花了6分钟来运行并给出输出。 我使用LEFT OUTER JOIN和RIGHT OUTER JOIN的UNION做了同样的事情。仅用了15秒 有人知道为什么会这样吗? 问题答案: 您可能在两个表中都有很多行,共有几行,并且所讨论的列上没有索引。

  • 问题内容: 很容易理解为什么左外部联接不是可交换的,但是我很难理解它们是否是可交换的。几家在线资源表明不是,但我还没有说服自己就是这种情况。 假设我们有三个表:A,B和C。 令A包含ID和B_ID两列,其中ID是表A的主键,B_ID是与表B的主键相对应的外键。 令B包含两列ID和C_ID,其中ID是表B的主键,C_ID是与表C的主键相对应的外键。 让C包含ID和VALUE两列,其中ID是表C的主键