Django QuerySet的select_related()函数
来源:互联网 发布:万方数据库的核心期刊 编辑:程序博客网 时间:2024/05/16 22:15
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
- 用命令将as编译成swf
- PAT_1025: PAT Ranking
- android 电池(三):android电池系统 .
- stm8程序段定位,理解lkf文件
- 解决twitter streamAPI 网络链接问题
- Django QuerySet的select_related()函数
- Android数据库升级实例
- 使用SetWindowsHookEx(WH_KEYBOARD,...)制作全局键盘钩子
- 导航定位position模块
- ubuntu自动加载第二块硬盘
- linux -readme文档-值得一看
- WINCE简单LED应用程序的编写
- 黑马程序员--java中父类和子类都有构造方法时,子类对象的初始化过程
- 信号安装函数sigaction与结构体struct sigaction