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

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.kler.cn/a/541641.html

相关文章:

  • 分治下的快速排序(典型算法思想)—— OJ例题算法解析思路
  • 前瞻技术解密:未来生活的改变与机遇
  • opc da 服务器数据 转 EtherCAT项目案例
  • python卷积神经网络人脸识别示例实现详解
  • FFmpeg + OpenGL ES 美颜相机教程大纲
  • 【前端开发】HTML+CSS+JavaScript前端三剑客的基础知识体系了解
  • C++适用于所有输入法的解决方案(切换输入法)
  • GPIO函数详解(二)
  • pytest测试专题 - 1.2 如何获得美观的测试报告
  • 【Vue中BUG解决】npm error path git
  • ThreadLocal 原理?需要注意什么?
  • 自动控制视频讲解
  • CCFCSP备考第二天
  • 2.协同过滤算法
  • 第四期书生大模型实战营-第4关-L2G4000
  • 【RabbitMQ的监听器容器Simple和Direct】 实现和场景区别
  • 计算机视觉的研究方向、发展历程、发展前景介绍
  • Java网络编程学习(一)
  • 【leetcode 28】27.移除元素==双指针==
  • 【系统架构设计师】面向架构评估的质量属性
  • malloc底层原理 brk,sbrk,mmap
  • Spark 源码 | 脚本分析总结
  • 【Qt之·类QTextCursor】
  • 深入浅出:图解Vue 3生命周期的全流程
  • 红外皮秒激光器:开启超快激光技术新时代
  • 算法03-基数排序