Django3 个人开发笔记

查询函数

select_related 内连接

在 Django ORM 中,select_related 是一个查询性能优化工具,用于解决关联对象的查询效率问题。当你有两个通过外键(ForeignKey)或一对一字段(OneToOneField)连接的模型时,通常需要分别查询每个对象。

假设有两个模型 AuthorBook,其中 Book 模型有一个外键指向 Author。如果你要获取所有书籍以及它们的作者信息,不使用 select_related 的话,默认情况下 Django 会为每本书生成单独的数据库查询去获取作者信息。这就造成了"N+1"查询问题 —— 对于 N 本书,你将得到 N+1 次数据库查询(1次查询所有书籍,N次分别查询每本书的作者)。

使用 select_related 则可以避免这个问题,它会通过 SQL 的 JOIN 语句一次性从相关联的表中预先获取数据,转换成你需要的对象。这样,无论你查询多少本书,只需要一次数据库查询就可以同时获取所有书籍和相应的作者信息。

以下是一个简单的示例,展示了没有使用和使用 select_related 的区别:

没有使用 select_related:

books = Book.objects.all()
for book in books:print(book.title, book.author.name) # 这里每次循环都会产生一个新的数据库查询来获取 author

使用 select_related:

books = Book.objects.select_related('author').all() # 使用 JOIN 语句提前获取所有作者信息
for book in books:print(book.title, book.author.name) # 不会产生额外的数据库查询

在上述使用 select_related 的例子中,Django 会生成一个更复杂的 SQL 查询,但总体上减少了数据库的访问次数,从而优化了性能。此方法适用于“贪婪加载”关联数据的场景,特别是当你知道你需要关联数据并且想减少数据库查询的数量时。

select_related 相当于 SQL 语言中的 JOIN 操作,特别是 INNER JOIN。当你在 Django ORM 中使用 select_related 方法时,它会生成一个包含 JOIN 子句的 SQL 查询,这个子句将主表(如 Book)和相关联的表(如 Author)连接起来,从而一次查询就能获取所有必要的数据。

例如,如果我们有以下两个模型:

class Author(models.Model):name = models.CharField(max_length=100)class Book(models.Model):title = models.CharField(max_length=100)author = models.ForeignKey(Author, on_delete=models.CASCADE)

使用 select_related 的 Django 查询:

books = Book.objects.select_related('author').all()

这将生成类似如下的 SQL 语句:

SELECT book.id, book.title, author.id, author.name
FROM book
INNER JOIN author ON book.author_id = author.id;

在这条 SQL 语句中,INNER JOINbook 表和 author 表连接起来,让你可以通过单个查询同时访问关联的 BookAuthor 实例的字段。这避免了逐个获取作者信息的额外查询,大幅提高了效率,尤其是在处理大量数据的时候。

prefetch_related 外连接

在Django ORM中,select_related 默认使用 SQL 的 INNER JOIN。如果你需要执行一个 LEFT OUTER JOIN 来包含那些在关联表中没有匹配记录的主表记录,你应该使用 prefetch_related 方法,它通过两个单独的查询来模拟 LEFT OUTER JOIN 的行为,并且在 Python 代码中将它们组合起来。

不过,从Django 1.11版本开始,引入了 QuerySetfilter() 方法与 isnull 查找条件相结合的方式来实现类似于 LEFT OUTER JOIN 的查询:

Book.objects.filter(author__isnull=True)

这会生成类似于以下的SQL LEFT OUTER JOIN语句:

SELECT * FROM book LEFT OUTER JOIN author ON book.author_id = author.id WHERE author.id IS NULL;

如果你想要获取所有书籍及其作者,但是保持那些没有作者的书籍在结果集中,你可以如下操作:

from django.db.models import Prefetchauthor_query = Author.objects.all()
books = Book.objects.prefetch_related(Prefetch('author', queryset=author_query))

上述代码首先会执行一次查询获取所有书籍,然后基于书籍中的外键关联的ID再执行第二次查询获取所有作者。在Python层面,Django会将这两个结果合并起来,模拟出 LEFT OUTER JOIN 的效果,并且即使有些书籍没有对应的作者信息,它们也会被包括在结果集中。

在某些情况下,你可以直接使用 annotate 结合 Count 或者 CaseWhen 等条件表达式来构造更复杂的 LEFT OUTER JOIN 类型的查询。

请注意,无论使用 prefetch_related 还是其他方法,Django都会试图以最优化的方式获取你请求的数据,但这些操作与用纯 SQL 直接编写的 LEFT OUTER JOIN 在底层执行上仍然是有差异的。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/834721.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

PyQt6--Python桌面开发(3.运行QTDesigner生成的ui文件程序)

运行QTDesigner生成的ui文件程序 用QTDesigner设计一个简单的UI 保存ui文件,放到项目里面去 通过pyqt6包里面的uic来加载ui文件 import sysfrom PyQt6.QtWidgets import QApplication from PyQt6 import uicif __name__ __main__:appQApplication(sys.argv)uiui…

Docker 安装的MySQL迁移数据库

1. 导出数据库 docker ps :查看数据库对应的 CONTAINER ID docker exec -it id /bin/bash : 进入到mysql的docker实例中 cd /usr/bin : 进入到bin目录 mysqldump -u root -p123456 study > /root/study_backup0509.sql :使用mysqldump备份库,注意密码与-p之间…

《探索信息技术中心一体化系统架构:提升企业数字化转型的效率与能力》

在当今数字化时代,信息技术中心(IT Center)扮演着至关重要的角色,它不仅是企业的技术支撑,更是推动数字化转型的引擎。为了更好地应对日益复杂的业务需求和技术挑战,许多企业开始探索一体化系统架构&#x…

一对一WebRTC视频通话系列(五)——综合调试和功能完善

本系列博客主要记录一对一WebRTC视频通话实现过程中的一些重点&#xff0c;代码全部进行了注释&#xff0c;便于理解WebRTC整体实现。 本专栏知识点是通过<零声教育>的音视频流媒体高级开发课程进行系统学习&#xff0c;梳理总结后写下文章&#xff0c;对音视频相关内容感…

数据分析处理的步骤是什么?制造业企业如何挑选数据分析处理软件?看这篇就够了

随着工业4.0的深入实施以及国家对制造业高质量发展战略的日益强调&#xff0c;工业数据已经崭露头角&#xff0c;成为生产经营活动中至关重要的核心要素。不仅如此&#xff0c;工业数据还作为优质的生产要素&#xff0c;为新兴生产力的形成提供了强有力的支撑&#xff0c;从而推…

服务异步通讯MQ

同步调用存在的问题: 异步调用方案: RabbitMQ安装: 第一种:在线拉取 docker pull rabbitmq:3-management 第二种:将已有的安装包放入再用load加载 我这里放到tmp包里边 然后:cd /tmp docker load -i mq.tar 加载进去 然后运行mq容器 docker run \-e RABBITMQ_DEFAULT_USER…

大模型入门(六)—— RLHF微调大模型

一、RLHF微调三阶段 参考&#xff1a;https://huggingface.co/blog/rlhf 1&#xff09;使用监督数据微调语言模型&#xff0c;和fine-tuning一致。 2&#xff09;训练奖励模型 奖励模型是输入一个文本序列&#xff0c;模型给出符合人类偏好的奖励数值&#xff0c;这个奖励数值…

未来编码探索:揭秘Java的进化之旅与技术革新!

Java是一种广泛使用的编程语言&#xff0c;自1995年问世以来&#xff0c;它在企业级应用、移动应用开发、大数据处理等领域都有着广泛的应用。随着时间的推移&#xff0c;Java也在不断发展和进化&#xff0c;以满足不断变化的技术需求和市场趋势。本文将全面详细地探讨Java的未…

MyBatis(该篇足已)

目录 一.MyBatis是什么&#xff1f; 二.为什么学习MyBatis呢&#xff1f; 三.MyBatis的学习 3.1MyBatis的开发流程 3.2MyBatis项目 四.MyBatis的增删改操作 五.参数占位符 #{} 和 ${} 六.映射返回 七.映射失败 八.数据库连接池 九.动态SQL 9.1<if>标签 9.2&…

LeetCode63:不同路径Ⅱ

题目描述 一个机器人位于一个 m x n 网格的左上角 &#xff08;起始点在下图中标记为 “Start” &#xff09;。 机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角&#xff08;在下图中标记为 “Finish”&#xff09;。 现在考虑网格中有障碍物。那么从左上角…

5.07 Pneumonia Detection in Chest X-Rays using Neural Networks

肺炎诊断是一个耗时的过程&#xff0c;需要高技能的专业人员分析胸部X光片chest X-ray (CXR)&#xff0c;并通过临床病史、生命体征和实验室检查确认诊断。 它可以帮助医生确定肺部感染的程度和位置。呼吸道疾病在 X 光片上表现为一处膨胀的不透明区域。然而&#xff0c;由于不…

力扣HOT100 - 155. 最小栈

解题思路&#xff1a; 辅助栈 class MinStack {private Stack<Integer> stack;private Stack<Integer> min_stack;public MinStack() {stack new Stack<>();min_stack new Stack<>();}public void push(int val) {stack.push(val);if (min_stack.i…

LeetCode 404.左叶子之和

LeetCode 404.左叶子之和 1、题目 题目链接&#xff1a;404. 左叶子之和 给定二叉树的根节点 root &#xff0c;返回所有左叶子之和。 示例 1&#xff1a; 输入: root [3,9,20,null,null,15,7] 输出: 24 解释: 在这个二叉树中&#xff0c;有两个左叶子&#xff0c;分别…

SaToken框架实现在Rpc上下文的login处理逻辑

最近在工作中遇到一个需求&#xff0c;需要在项目A中实现一个rpc接口供其他项目调用&#xff0c;接口返回登录token&#xff0c;从而实现其他项目的用户能免密登录到项目A。 项目A是用了SaToken来做的鉴权&#xff0c;原本我的打算是直接在rpc中调用StpUtil.login()方法来实现登…

在Flask中使用Celery完成异步和定时任务(Flask、Celery、Redis)

编程目标 通过使用Flask和Celery&#xff0c;实现一个简单的Web应用程序&#xff0c;能够接收HTTP POST请求&#xff0c;并异步发送电子邮件。 说明 使用Flask创建一个简单的Web应用程序&#xff0c;包含一个HTTP POST路由&#xff0c;用于接收发送电子邮件的请求。使用Cele…

基于Spring Boot的酒店管理系统设计与实现

基于Spring Boot的酒店管理系统设计与实现 开发语言&#xff1a;Java 框架&#xff1a;springboot JDK版本&#xff1a;JDK1.8 数据库工具&#xff1a;Navicat11 开发软件&#xff1a;eclipse/myeclipse/idea 系统部分展示 系统首页界面图&#xff0c;在系统首页可以查看首页…

java io包

InputStream InputStream 是 Java I/O 中所有输入流的抽象基类&#xff0c;它定义了读取字节流的基本方法。InputStream 类提供了许多子类&#xff0c;用于从不同的数据源读取数据&#xff0c;如文件、网络连接、内存等。 InputStream 提供了以下常用的方法&#xff1a; int…

【数学建模】天然肠衣搭配问题衍生问题/线性规划限制条件建立问题

线性规划限制条件建立问题 前景回顾/提出问题回顾1回顾2/问题提出解决前提 解决方法坐标轴(区间)法总结 前景回顾/提出问题 回顾1 首先回顾一下DVD在线租赁问题 在 question2中&#xff0c;需要保证每个人都不会收到自己不喜欢的DVD&#xff0c;即客户在线订单数为0时候&…

umi6.x + react + antd的项目增加403(无权限页面拦截),404,错误处理页面

首先在src/pages下创建403&#xff0c;404&#xff0c;ErrorBoundary 403 import { Button, Result } from antd; import { history } from umijs/max;const UnAccessible () > (<Resultstatus"403"title"403"subTitle"抱歉&#xff0c;您无权…

HarmonyOS开发之ArkTS使用:新建活动页面

目录 目录 引言 关于ArkTS 开发环境准备 新建项目 新建活动页面 编写ArkTS代码 注册页面 运行应用 最后 引言 随着HarmonyOS&#xff08;鸿蒙操作系统&#xff09;的不断发展&#xff0c;越来越多的前端开发者投入到这个全新的生态系统中。而在HarmonyOS的开发中&…