Django中的完全外部联接

Django中的完全外部联接,第1张

Django中的完全外部联接

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 isNone
:我们本质上是在寻找
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>

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



欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/zaji/5106595.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-11-16
下一篇 2022-11-17

发表评论

登录后才能评论

评论列表(0条)

保存