gpt4 book ai didi

sql - django 中的全外连接

转载 作者:行者123 更新时间:2023-12-04 06:30:12 24 4
gpt4 key购买 nike

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

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

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

最佳答案

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 :我们实际上是在寻找没有 Model1 对象关联的 Model2 项目。嗯……为什么我们将它们放在外连接中,只是为了过滤他们使用 if 语句?为什么不单独查询并正确处理每个子集?

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

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

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

关于sql - django 中的全外连接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/252976/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com