sql – django中的完全外连接
如何使用
django QuerySet API在M2M关系芯片上创建完整外部联接的查询?
它不受支持,一些提示创建我自己的经理来做这件事将是受欢迎的. 编辑添加: 解决方法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 问题始终是,您正在使用这三个不同对象子集的奇怪集合进行哪些处理? 对象数据库的要点是将处理集中在对象及其关联对象上. 称为“关系连接”的特殊集合永远不会出现在原始对象模型中.它是由两个(或更多)原始对象构建的新类对象. 更糟糕的是,外连接创建了一个具有多个子类的集合(内连接,左外连接和右外连接).这些东西是什么意思? 等等,它会变得更糟.如果处理包括检查缺少的属性(即someObj.anObj2attribute是否为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> 看起来像一个完整的外部联接报告.没有完整的外部联接. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
- sql-server – 获取从存储过程返回的列名称/类型
- sql-server – Transact-SQL查询中字符串前的N前缀
- sqlserver 海量数据导入的最快方法
- sql – ALTER TABLE语句与FOREIGN KEY约束冲突
- SqlServer2008的卸载
- sql – 在Oracle中regexp_replace vs translate的性能?
- SQL Server 利用触发器对多表视图进行更新的实现方法
- sql – 列’mary’不存在
- sql-server – IntelliSense无法正常工作但已启用
- SQLServerException: Arithmetic overflow error convertin