Django QuerySet的select_related()函数

通过使用Django的select_related()函数可以有效地减少数据库查询次数。在获取包含外键关系的实体时,此函数允许一次性加载所有相关联的数据,避免了为每个外键单独查询数据库的情况。

转自panjj 发表于 2010-07-04 11:30

Django获取数据实体的时候,返回的对象一个实体或多个实体,也就是QuerySet,它是Django专有的东西,具体的理解,它是类似Python的字典的东西,但它并不实现字典的所有方法。今天讲解的是它其中的一个函数select_related()。


select_related()使用的场景,是获取实体的同时,能快速获取到它对应的外键关系实体。如果获取实体时没有使用select_related(),要引用该实体的外键关系,那么就会重新连接数据库去获取对应实体了。比如 作者Author 博客Blog 两个表,他们的关系 是一个作者Author有多个博客blog,;当我们想获取到一个作者的同时 直接引用该作者的所有博客时,常规做法是会进行两次数据库连接的,但使用了select_related()后,情况就有所变化了,它第一次连接数据库获取该作者的时候,该作者的所有博客被获取到了。
比如:
author=Author.objects.select_related().get(pk=1)  #获取id是1的作者; 获取该博客的同时已经获取到该作者的所有博客
blogs=author.blog #获取id是1作者的所有博客blogs  ,这时并不需要连接数据库获取那些博客了。

不使用select_related()时:
author=Author.objects.get(pk=1)  #获取id是1的作者;仅仅获取该作者的实体
blogs=author.blog #获取id是1作者的所有博客blogs  ,但需要连接数据库获取该作者的那些博客。

select_related()提供了一个备选参数depth,执行获取对象关联实体的深度。如 select_related(depth=2),这时不仅仅获取到相关的博客,还能获取到博客的关联实体,比如博客的类别(另一个和blog表相对应的表)之类的。如果不指定depth,默认情况将会获取到该作者的所有关联对象的 包括关联对象的子关联对象。由此可以想象,使用它有利有弊,当自己需要对象相关关联对象的时候,可以使用它,只是这样第一次查询的时候,将进行不少表的操作(要看表关联复杂程度)。

所以当我们获取对象需要它相关联的对象时,就请用select_related()吧,如果该对象关联的表很多,请指定depth的值,避免资源的浪费;反之避免select_related()。
#首先安装Quartus II 11.0(默认是32/64-Bit一起安装):#用Quartus_II_11.0_x64破解器(内部版).exe破解C:\altera\11.0\quartus\bin64下的sys_cpt.dll和quartus.exe文件(运行Quartus_II_11.0_x64破解器(内部版).exe后,直接点击“应用补丁”,如果出现“未找到该文件。搜索该文件吗?”,点击“是”,(如果直接把该破解器Copy到C:\altera\11.0\quartus\bin64下,就不会出现这个对话框,而是直接开始破解!)然后选中sys_cpt.dll,点击“打开”。安装默认的sys_cpt.dll路径是在C:\altera\11.0\quartus\bin64下)。#把license.dat里的XXXXXXXXXXXX 用您老的网卡号替换(在Quartus II 11.0的Tools菜单下选择License Setup,下面就有NIC ID)。#在Quartus II 11.0的Tools菜单下选择License Setup,然后选择License file,最后点击OK。#注意:license文件存放的路径名称不能包含汉字和空格,空格可以用下划线代替。#备注:此软件在Windows XP和Windows 7的32/64位操作系统下都验证过了,没有问题!Windows Vista 32/64因为微软都放弃了,所以没有验证,理论上应该可以正常使用。#仅限于学习,不要用于商业目的! 严禁贴到网上!!!#此软件已经通过了诺顿测试,在其它某些杀毒软件下,也许被误认为是“病毒”,这是杀毒软件智能化程度不够的原因,所以暂时关闭之。#内部版,没有在启动画面中加入了“Altera中国区代理――骏龙科技有限公司”的防伪字样。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值