Django Queryset方法select_related()

小编 2026-07-05 阅读:656 评论:0
select_related() 返回一个带有外键关系的QuerySet,在执行查询时可以选择其他关联对象的数据,这是一个性能增强,这样可以做更复杂的查询,而且意味着以后使用外键关系不需要再次做数据库查询...

select_related()

返回一个带有外键关系的QuerySet,在执行查询时可以选择其他关联对象的数据,这是一个性能增强,这样可以做更复杂的查询,而且意味着以后使用外键关系不需要再次做数据库查询。

下面的例子解释了普通查询和select_related()查询的区别, 下面是一个标准查询:

# 访问数据库
e = Entry.objects.get(id=1)

# 在此访问数据库以得到关联的Blog对象(外键)
b = e.blog

select_related()查询:

# 访问数据库
e = Entry.objects.select_related(\'blog\').get(id=1)

# 不会访问数据库,因为e.blog已经在前面的查询中预先填充
b = e.blog

select_related()可以用于objects的所有查询集:

from django.uils import timezone

# 查询所有计划在未来发布的博客
blogs = set()

for e in Entry.objects.filter(pub_date__gt=timezone.now()).select_related(\'blog\'):
    # 如果没有select_related(),每一次循环都会查询一次数据库去取每一个entry关联的blog
    blogs.add(e.blog)

filter()和select_related()的顺序无所谓,下面两条查询是一样的:

Entry.objects.filter(pub_date__gt=timezone.now()).select_related(\'blog\')
Entry.objects.select_related(\'blog\').filter(pub_date__gt=timezone.now())

可以用类似的方式查询外键,例如下面的models:

from django.db import models

class City(models.Model):
    # ...
    pass

class Person(models.Model):
    # ...
    hometown = models.ForeignKey(
        City,
        on_delete=models.SET_NULL,
        blank=True,
        null=True,
    )

class Book(models.Model):
    # ...
    author = models.ForeignKey(Person, on_delete=models.CASCADE)

然后这条查询Book.objects.select_related(\'author__hometown\').get(id=4)会缓存关联的Person和与Person关联的City。

# 通过与author和hometown表的连接访问数据库,缓存好author和hometown
b = Book.objects.select_related(\'author__hometown\').get(id=4)
p = b.author         # 不会访问数据库
c = p.hometown       # 不会访问数据库

# Without select_related()...
b = Book.objects.get(id=4)  # Hits the database.
p = b.author         # 访问数据库
c = p.hometown       # 访问数据库

你可以在传递给select_related()的字段列表中引用任何ForeignKey或OneToOneField关系。

如果需要清除QuerySet上以前的select_related调用添加的关联字段,可以传递一个None作为参数:

without_relations = queryset.select_related(None)

select_related可以链式调用,也就是说,select_related(\'foo\', \'bar\')等同于select_related(\'foo\').select_related(\'bar\')

 

版权声明

本文仅代表作者观点,不代表百度立场。
本文系作者授权百度百家发表,未经许可,不得转载。

热门文章
  • Sequential Monte Carlo Methods (SMC) 序列蒙特卡洛/粒子滤波/Bootstrap Filtering

    Sequential Monte Carlo Methods (SMC) 序列蒙特卡洛/粒子滤波/Bootstrap Filtering
    Problem Statement 我们考虑一个具有马尔可夫性质、非线性、非高斯的状态空间模型(State Space Model):对于一个时间序列上的观测结果{yt,t∈N}\\{ y_t , t \\in N \\}{yt​,t∈N},我们认为每个观测结果yty_tyt​的生成依赖于一个无法直接观察的隐变量xt∈{xt,t∈N}x_t \\in \\{x_t , t \\in N \\}xt​∈{xt​,t∈N},即:p(...
  • 机房智能化温湿度解决方式之POE供电以太网温湿度传感器

    机房智能化温湿度解决方式之POE供电以太网温湿度传感器
    机房智能化温湿度解决方式之POE供电以太网温湿度传感器 北京盈创力和电子科技有限公司 智能型TCP网口温湿度记录仪 北京IP网络温湿度记录仪厂家,北京盈创力和 北京智能型TCP网口温湿度记录仪IP网络温湿度记录仪是一种新型的基于TCP/IP协议双绞线以太网标准温湿度采集模块,利用它可以实现现场温度值、相对湿度值的采集,同时利用其自身的RJ45通信接口可以方便地和机房监控主机或交换机集线器进行联网。 工作于-40℃~85℃工业级带...
  • Hive 系统函数及示例

    Hive 系统函数及示例
    查看所有系统函数 show functions; 函数分类 内置函数【系统函数】 数学函数: floor、round、ceil、cos、log2等 字符串函数: length、reverse、trim、lower、get_json_object、repeat等 收集函数: size 转换函数: cast 日期函数: year、month、datediff、date、date_add等 条件函数: coalesce、case…w...
  • HTTP状态保持的原理

    HTTP状态保持的原理
    a)在用户登录之后,浏览器返回响应的时候会在响应中添加上cookieb)浏览器接收到cookie之后会自动保存c)当用户再次请求同一服务器中的其他网页的时候,浏览器会自动带上之前保存的cookied)服务接收到请求之后可以请 request 对象中取到cookie 判断当前用户是否登录  Http是无状态的,就是连接时数据互通,关闭后...
  • CSRF的原理和防范措施

    CSRF的原理和防范措施
    a)攻击原理:i.用户C访问正常网站A时进行登录,浏览器保存A的cookieii.用户C再访问攻击网站B,网站B上有某个隐藏的链接或者图片标签会自动请求网站A的URL地址,例如表单提交,传指定的参数iii.而攻击网站B在访问网站A的时候,浏览器会自动带上网站A的cookieiv.所以网站A在接收到请求之后可判断当前用户是登录状态,所以...
标签列表