如何使用django QuerySet API创建跨M2M关系芯片的完全外部联接的查询?
它不受支持,欢迎提供有关创建我自己的经理来执行此操作的提示。
编辑添加: @ S.Lott:感谢您的启发。应用程序需要使用OUTER JOIN。即使它仍不完整,它也必须生成一个报告,显示输入的数据。我不知道结果将是一个新的类/模型。您的提示将对我有很大帮助。
问题来源于stack overflow
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。
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语句对其进行过滤?为什么不做呢?单独的查询和正确处理每个子集?
编辑:当您显示“不完整”状态时,它根本不是外部联接。这要简单得多。您需要在视图函数中创建一个(或两个)单独的集合,以显示模板。
首先,您应该使用状态码,而不要使用是否存在外键。可选的外键没有“理由”-它们在那里或不在那里。状态代码可以提供有用的含义阴影(“不完整”,“错误”,“损坏”,“不适用”,“要删除”等)
errorList1 = Model1.objects.filter( status="Incomplete" ) errorList2 = Model2.objects.filter( status="Incomplete" ) 这两个是完全外部联接的两个非联接部分。然后,您可以在模板中显示这两个错误列表,其中包含适当的列标题和状态代码以及所有内容。
您甚至可以将它们放在一个表中,以模仿人们过去看到的旧的完整外部联接报告
Model1 | Model2 |
---|