Django中select_related 的作用

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

在 Django 中,这句代码:

复制代码
Dynamic.objects.select_related('song')

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


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;

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


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

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

相关推荐
嘘神秘用10 小时前
布:AI 驱动的 Redis 客户端,更快、更直观
数据库·人工智能·redis
东北小狐狸-Hellxz12 小时前
Redis 哨兵搭建+ACL权限控制
数据库·redis
研究员子楚13 小时前
GEO行业发展标准体系白皮书V2.0-第09卷 · 适配篇:硅基主权伦理宪章与行业适配宣言
数据库·人工智能·geo
l1340620823515 小时前
鸿蒙实战:RDB 数据库设计与 DatabaseService
数据库·华为·harmonyos·鸿蒙系统
山峰哥15 小时前
数据库工程与索引策略实战指南‌
服务器·数据库·sql·oracle·深度优先
谙忆15 小时前
图片版权保护工程实战:明水印、盲水印(DCT隐写)、Referer防盗链与签名URL怎么落地
数据库
KaMeidebaby15 小时前
卡梅德生物技术快报|抗体合成:多肽抗体合成工程化方案:Nsp2 保守肽多抗制备与多维度验证
前端·网络·数据库·人工智能·算法
xfhuangfu16 小时前
19c CDB架构下的数据库启动和停止
数据库·架构
神道君天下16 小时前
填充与积累:积分与面积的可视化
数据库·oracle
爱折腾的小黑牛16 小时前
小程序云开发数据模型设计:礼账系统的三表结构
数据库·架构