首页 > 其他分享 >ORM 中没做外键关联,如何进行外联查询

ORM 中没做外键关联,如何进行外联查询

时间:2023-12-26 17:15:34浏览次数:27  
标签:set name models lines 外键 bk ORM 外联 查询


class Bk_set(models.Model):
  bk_set_name = models.CharField(verbose_name="信息系统中文全称", max_length=50)
  bk_set_id = models.CharField(verbose_name="集群id", max_length=20, null=True, blank=True)
  ...

class Dedicated_lines(models.Model):
  set_id=models.CharField(verbose_name="集群ID", max_length=50, null=True, blank=True)

  ...

要用Django ORM实现相似的左外连接查询,您可以使用annotate()方法结合Subquery()OuterRef()来模拟左外连接的行为。这种方法不如直接使用外键关联直观或高效,但如果您无法或不想改变模型结构,这是一种可能的解决方案。以下是如何实现的示例:

  1. 首先,确保已经导入了必要的Django模块:
from django.db.models import Subquery, OuterRef, CharField, Value
from your_app.models import Bk_set, Dedicated_lines
  1. 然后,准备子查询,这个子查询将从Bk_set获取bk_set_name
subquery = Bk_set.objects.filter(
bk_set_id=OuterRef('set_id')
).values('bk_set_name')[:1]
  1. 接下来,使用annotate()来给每个Dedicated_lines对象添加一个新字段bk_set_name
dedicated_lines_with_set_name = Dedicated_lines.objects.annotate(
bk_set_name=Subquery(subquery, output_field=CharField())
)
  1. 最后,遍历查询结果并使用:
for line in dedicated_lines_with_set_name:
print(line.bk_inst_name, line.monthly_fee, line.set_id, line.bk_set_name)

这段代码做了以下事情:

  • Subquery & OuterRef: 这两个函数被用来在annotate()中创建一个子查询。OuterRef用于引用外层查询的字段。
  • annotate(): 它被用来在查询结果的每一行中添加一个额外的字段,这里是bk_set_name
  • 执行查询: 最终的查询将在每个Dedicated_lines对象中添加bk_set_name字段。

这种方法的性能可能不如直接的SQL查询,尤其是在处理大量数据时。它更复杂,但提供了一种在不直接使用SQL的情况下在Django ORM中实现相似功能的方式。如果您的应用对性能要求较高,或者这类查询非常频繁,可能还是考虑优化数据库模型,设置适当的外键关系会更有效。

标签:set,name,models,lines,外键,bk,ORM,外联,查询
From: https://www.cnblogs.com/sjip008/p/17928797.html

相关文章

  • logstash抽取clickhouse数据库偶现网络错误异常并提示FORMAT TabSeparatedWithNamesAn
     如上图错误信息所示,可以看到第一次sql查询是正常的,在第二次offset偏移的时候报了网络错误。起初的想法就是clickhouse的问题,把sql粘贴出来放入clickHouse中单独执行发现sql并无问题。然后又认为是logstash的问题并分别下载了logstash-7.3.1、logstash-7.17.15、logstash-8.11.......
  • MySql的information_schema.processlist库学习之"如何检测出大数据sql查询"
    1.如何通过MySql检测出大数据sql查询一般数据库都会存在:information_schema数据库 检测出大数据sql查询[time时间越长说明,数据量越大,要根据公司的限度来衡量,我的思路是500以上都要查看是否是大数据的范畴]2.案例--检测出大数据sql查询[time时间越长说明,数据量越大,要根据......
  • C# WinForm控件之advTree
    原文链接:https://www.cnblogs.com/SoftWareIe/p/8757270.html0.属性和方法//属性方法advTree1.DragDropEnabled=!advTree1.DragDropEnabled;//控制是否可以拖动节点advTree1.MultiSelect=!advTree1.MultiSelect;//控制节点是否可以多选advTree1.ExpandButtonType=Dev......
  • 自然语言处理的模型:从 Bag of Words 到 Transformer
    1.背景介绍自然语言处理(NLP)是计算机科学与人工智能的一个分支,研究如何让计算机理解、生成和处理人类语言。自然语言处理的主要任务包括文本分类、情感分析、命名实体识别、语义角色标注、语义解析、机器翻译等。随着大数据时代的到来,自然语言处理技术的发展得到了巨大的推动。在过......
  • winforms入门简介
    原文链接:https://upimg.baike.so.com/doc/9995803-10343583.htmlwinforms脚本都是基于c#,winforms是做客户端软件,WinForm是.Net开发平台中对WindowsForm的一种称谓。简单来说:WinForms和ASP.NET的平台支持C#和VB.NET编程语言。WinForms是做客户端软件,ASP.NET是基于网络开发的......
  • kettle从入门到精通 第二十六课 再谈 kettle Transformation executor
     1、前面文章有学习过Transformationexecutor ,但后来测试kettle性能的时候遇到了很大的问题,此步骤的处理性能太慢,导致内存溢出等问题。所以再次一起学习下此步骤的用法。 2、 如下图中rds-sametable-同步逻辑处理使用的是Transformationexecutor步骤,最后Speed列表示处理速......
  • form
    antd的`FormItem`中的`value`属性通常是与表单数据关联的。对于包含按钮和弹出modal的场景,你可能需要使用`getFieldDecorator`来将表单项与`value`关联起来,以便在表单提交时能够获取所选的值。首先,确保你在`FormItem`中使用了`getFieldDecorator`,例如:```jsx<Form.Itemlabel="Yo......
  • 人工智能大模型原理与应用实战:从Transformer到Vision Transformer
    1.背景介绍人工智能(ArtificialIntelligence,AI)是计算机科学的一个分支,研究如何让计算机模拟人类的智能。在过去的几年里,人工智能技术的发展取得了显著的进展,尤其是在自然语言处理(NaturalLanguageProcessing,NLP)和计算机视觉(ComputerVision)等领域。这些进展主要归功于深度学习......
  • 写原生SQL和使用ORM框架相比优缺点
    一、写原生SQL1.1优点理论上来说更可控,想怎么写就怎么写。相对来说开发起来可能更快速1.2缺点问题不好排查,可能会耗费更多时间切换数据库,sql需要重新调整(各个数据库sql写法存在区别)如果是数据结构中某个字段有修改,所有使用到当前数据库字段的地方都需要修改(特别是通过......
  • C# .NET的BinaryFormatter、protobuf-net、Newtonsoft.Json以及自己写的序列化方法序
    https://www.cnblogs.com/s0611163/p/11872484.html测试结果整理后: 结论:1、这几个工具中,protobuf-net序列化和反序列化效率是最快的2、BinaryFormatter和Newtonsoft.Json反序列化慢的比较多3、Newtonsoft.Json序列化后的文件体积比较大4、Newtonsoft.Json在序列化反序列......