当前位置: 首页 > news >正文

Django中select_related 的作用

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.lryc.cn/news/535388.html

相关文章:

  • vscode无法ssh连接远程机器解决方案
  • 计算机组成原理——中央处理器(九)
  • 网页版贪吃蛇小游戏开发HTML实现附源码!
  • 基于java ssm springboot选课推荐交流平台系统设计和实现
  • Sigma-Aldrich化学品安全技术说明书(SDS)查询教程
  • 嵌入式实训室解决方案(2025年最新版)
  • Spring Cloud — 深入了解Eureka、Ribbon及Feign
  • 全排列(力扣46)
  • Mac部署Jenkins 一
  • 附录1:组维英文简写大全
  • SQL Server:查看内存使用情况
  • chrome-mojo C++ Bindings API
  • uniapp + vite + 使用多个 ui 库
  • Unity3D 制作动画的时间轴管理方案: Timeline编
  • 逻辑回归不能解决非线性问题,而svm可以解决
  • Prompt通用技巧1
  • C# 上位机--枚举
  • 01docker run
  • 易语言.飞扬特性展示2
  • FlashDecoding
  • 提示词生成新方法,用Make自动化生成
  • 每日一题——括号生成
  • 实操部署DeepSeek,添加私有知识库
  • 宜宾数字经济新标杆:树莓集团赋能区域产业转型升级
  • 8.大规模推荐系统的实现
  • 第三届通信网络与机器学习国际学术会议(CNML 2025)
  • MySQL两阶段提交策略
  • uniapp商城之购物车模块
  • STM32_USART通用同步/异步收发器
  • python自动化测试之Pytest框架之YAML详解以及Parametrize数据驱动!