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,一经查实,立即删除!

相关文章

《青少年成长管理2024》102 “计划执行:计划执行”

《青少年成长管理2024》102 “计划执行:计划执行” 一、执行力的重要性(一)什么是执行力(二)执行力对目标的要求(三)执行力的重要性(四)执行力的构成 二、影响计划执行的…

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…

C++:多态-虚析构和纯虚析构

虚析构 “虚析构”通常指的是在 C 中的虚析构函数(virtual destructor)。虚析构函数是一个在基类中声明为虚函数的析构函数。它在派生类中可以被重写,并且当通过基类指针删除派生类对象时,可以确保派生类的析构函数被正确调用。 …

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…

npm详解:掌握 Node.js 包管理的艺术

在现代软件开发领域,包管理和依赖处理是任何项目不可或缺的一部分。对于基于 Node.js 的应用程序而言,NPM(Node Package Manager)不仅是安装和管理第三方库的标准工具,也是发布、共享和重用代码片段的核心平台。本文将…

一对一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…

(13)配置飞行中的FFT(一)

文章目录 前言 1 参数说明 前言 ArduPilot 预先配置了所有 FFT 设置的适当默认值。 &#xff01;Note 此功能包含在内存为 2MB 的自动驾驶仪中。请查看自动驾驶仪的"各板固件限制列表"(List of Firmware Limitations by Board)&#xff0c;以确定你的自动驾驶仪…

Fourteen Day 2024年5月10日

Battle n.战斗 战役 战争 vi.决战 斗争 Gun battle. 枪战 Gun n.枪 炮 Go out to battle. 奔赴战场。 Cattle n.牛 The cattle were eating grass. 牛在吃草。 Grass n.草 草坪 牧场 Stand n.站 坐落 She stands in the rain. 她站在雨中。 Rain n.雨 vi.下雨 Sta…

大模型入门(六)—— 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…

OLAP与OLTP

OLAP 简介 OLAP&#xff08;联机分析处理&#xff0c;全称Online Analytical Processing&#xff09;是一种针对大规模数据集进行高性能分析和查询的数据处理技术。与传统的联机事务处理&#xff08;OLTP&#xff09;不同&#xff0c;OLAP更侧重于支持复杂的分析和决策支持任…

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()方法来实现登…