Django QuerySet的select_related()函数
来源:互联网 发布:php文件上传类库 编辑:程序博客网 时间:2024/04/30 03:30
转自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()。
- Django QuerySet的select_related()函数
- Django QuerySet的select_related()函数
- Django QuerySet的select_related()函数
- DJANGO基础学习之QuerySet的select_related()函数
- 实例详解Django的 select_related 和 prefetch_related 函数对 QuerySet 查询的优化(一)
- 实例详解Django的 select_related 和 prefetch_related 函数对 QuerySet 查询的优化(二)
- 实例详解Django的 select_related 和 prefetch_related 函数对 QuerySet 查询的优化(三)
- Django的 select_related 和 prefetch_related 函数对 QuerySet 查询的优化(一)
- Django的 select_related 和 prefetch_related 函数对 QuerySet 查询的优化(一)
- 实例详解Django的 select_related 和 prefetch_related 函数对 QuerySet 查询的优化(一)
- 实例详解Django的 select_related 和 prefetch_related 函数对 QuerySet 查询的优化(二)
- 实例详解Django的 select_related 和 prefetch_related 函数对 QuerySet 查询的优化(三)
- django select_related 和 prefetch_related 函数对 QuerySet 查询的优化(二)
- django select_related 和 prefetch_related 函数对 QuerySet 查询的优化(三)
- Django的select_related 和 prefetch_related 函数优化查询
- 合并两个django的queryset
- Django QuerySet的基本API
- django-QuerySet
- try-finally 启示
- 算法:简单选择排序
- finally是肯定会执行的
- C# XML helper
- 荷兰迎来十连胜
- Django QuerySet的select_related()函数
- Linux 用户(user)和用户组(group)管理概述
- LabVIEW与数据库使用LabSQL
- Hibernate介绍
- 动态规划的中文分词方法
- 半决赛之乌拉圭vs荷兰
- windows mobile 文件包的引用
- Coding in the Shade: Using Eclipse with Google Data APIs
- 解决“无法删除文件:无法读源文件或磁盘”