Django中select_related 的作用

devtools/2025/2/13 23:20:46/

Django中这句代码Dynamic.objects.select_related('song')是什么意思?

在 Django 中,这句代码:

Dynamic.objects.select_related('song')

的作用是 在查询 Dynamic 模型的同时,预加载 song 关联的外键对象,从而减少数据库查询次数,提高查询效率。


1. select_related 的作用

select_related() 适用于 外键(ForeignKey)或一对一(OneToOneField) 的预加载,Django 会使用 SQL 的 JOIN 语句 一次性获取相关数据,避免 N+1 查询问题。


2. 假设的模型结构

假设 Dynamic 模型中有一个 song 字段,它是指向 Song 模型的 外键

class Song(models.Model):title = models.CharField(max_length=100)artist = models.CharField(max_length=100)class Dynamic(models.Model):song = models.ForeignKey(Song, on_delete=models.CASCADE)views = models.IntegerField()

如果你直接查询:

dynamics = Dynamic.objects.all()
for dynamic in dynamics:print(dynamic.song.title)  # 这里会触发 N+1 查询问题

Django 默认是 懒加载,每次访问 dynamic.song 时,都会执行一个新的 SQL 查询(N+1 查询问题)。


3. select_related('song') 的优化

dynamics = Dynamic.objects.select_related('song')
for dynamic in dynamics:print(dynamic.song.title)  # 不会触发额外查询

Django 会使用 JOIN 语句 一次性获取 DynamicSong 表的数据:

SELECT dynamic.*, song.*
FROM dynamic
JOIN song ON dynamic.song_id = song.id;

这样,所有数据都在 一次查询 中获取,避免了多个查询,提高了性能。


4. select_related vs prefetch_related

  • select_related('song') 适用于 外键(ForeignKey)和一对一(OneToOneField),使用 JOIN 查询 直接获取数据。
  • prefetch_related('song') 适用于 多对多(ManyToManyField)或反向外键(related_name),会执行 两次查询,然后在 Python 代码中进行匹配。

如果 song 是外键,推荐使用 select_related('song'),因为它更高效。


http://www.ppmy.cn/devtools/158617.html

相关文章

Baumer集成一体式相机堡盟一体式相机相机如何通过NeoAPI SDK使用自动对焦功能和可分区光源控制功能(C#)

Baumer集成一体式相机堡盟一体式相机相机如何通过NeoAPI SDK使用自动对焦功能和可分区光源控制功能(C#) Baumer工业相机Baumer集成一体式相机具备自动对焦和光源控制功能的技术背景Baumer工业相机通过NeoAPI SDK使用自动对焦功能和可分区光源控制功能1.引…

深度探索未来的搜索引擎 —— DeepSeek

随着信息时代的进步,我们每天都在生成、分享和消费大量的数据,如何从海量的内容中迅速找到有价值的信息,成为了现代社会的重要课题。传统的搜索引擎虽然在很长时间内引领了互联网的发展,但随着技术的进步和用户需求的变化&#xf…

从 0 开始本地部署 DeepSeek:详细步骤 + 避坑指南 + 构建可视化(安装在D盘)

个人主页:chian-ocean 前言: 随着人工智能技术的迅速发展,大语言模型在各个行业中得到了广泛应用。DeepSeek 作为一个新兴的 AI 公司,凭借其高效的 AI 模型和开源的优势,吸引了越来越多的开发者和企业关注。为了更好地…

天神之眼vs华为智驾

“天神之眼”和“华为智驾”分别是比亚迪和华为在智能驾驶领域推出的技术方案,两者均代表了国内顶尖的自动驾驶技术水平,但在技术路线、功能侧重和生态布局上存在差异。以下是两者的对比分析: 1. 技术路线 比亚迪天神之眼: 基于自…

HTML 入门基础

1.排版标签 1. h1 最好写一个, h2~h6 能适当多写。 2. h1~h6 不能互相嵌套,例如: h1 标签中最好不要写 h2 标签了。 3. p 标签很特殊!p标签不能写块级元素(独占一行的叫块级元素) 4. 块级元素可以写行内元素和块级元…

VSCode中出现“#include错误,请更新includePath“问题,解决方法

1、出现的问题 在编写C程序时,想引用头文件但是出现如下提示: (1)首先检查要引用的头文件是否存在,位于哪里。 (2)如果头文件存在,在编译时提醒VSCode终端中"#include错误&am…

南大通用数仓-GCDW-学习-05-外部表

目录 一、环境信息 二、概念 三、注意点 四、支持数据源和数据格式 五、实操 1、创建外部表 (1)语法树 (2)示例 2、查看外部表 (1)语法树 (2)示例 3、查看外部表详细 &a…

38.社区信息管理系统(基于springboothtml)

目录 1.系统的受众说明 2.需求分析及相关技术 2.1设计目的 2.2社区信息管理系统的特点 2.3可行性分析 2.3.1技术可行性 2.3.2运行可行性 2.4系统设计 2.4.1系统功能分析 2.4.2管理员权限功能设计 2.4.3业主权限功能设计 2.5系统的技术介绍 2.5.1 Html 2.5.2 Aja…