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()。

select_related()函数的更多相关文章

  1. Django 中的select_related函数优化查询

    参考链接: https://blog.csdn.net/secretx/article/details/43964607 在数据库有外键的时候,使用select_related()和prefech_r ...

  2. Django的 select_related 和 prefetch_related 函数对 QuerySet 查询的优化(一)

    在数据库有外键的时候,使用 select_related() 和 prefetch_related() 可以很好的减少数据库请求的次数,从而提高性能.本文通过一个简单的例子详解这两个函数的作用.虽然Q ...

  3. 深入select_related与prefetch_related函数

    阅读博客http://blog.jobbole.com/74881/的笔记 在数据库有外键的时候,使用select_related()和prefetch_related()可以很好的减少数据库请求的次 ...

  4. Django框架详细介绍---ORM相关操作---select_related和prefetch_related函数对 QuerySet 查询的优化

    Django的 select_related 和 prefetch_related 函数对 QuerySet 查询的优化 引言 在数据库存在外键的其情况下,使用select_related()和pre ...

  5. Django的select_related 和 prefetch_related 函数优化查询

    在数据库有外键的时候,使用 select_related() 和 prefetch_related() 可以很好的减少数据库请求的次数,从而提高性能.本文通过一个简单的例子详解这两个函数的作用.虽然Q ...

  6. 转载 :实例详解Django的 select_related 和 prefetch_related 函数对 QuerySet 查询的优化(一)

    在数据库有外键的时候,使用 select_related() 和 prefetch_related() 可以很好的减少数据库请求的次数,从而提高性能.本文通过一个简单的例子详解这两个函数的作用.虽然Q ...

  7. 详解Django的 select_related 和 prefetch_related 函数对 QuerySet 查询的优化

    在数据库有外键的时候,使用 select_related() 和 prefetch_related() 可以很好的减少数据库请求的次数,从而提高性能.本文通过一个简单的例子详解这两个函数的作用. 1. ...

  8. Django的 select_related 和 prefetch_related 函数对 QuerySet 查询的优化

    引言 在数据库存在外键的其情况下,使用select_related()和prefetch_related()很大程度上减少对数据库的请求次数以提高性能 1.实例准备 模型: from django.d ...

  9. Django中的QuerySet查询优化之select_related

    在数据库有外键的时候,使用 select_related() 和 prefetch_related() 可以很好的减少数据库请求的次数,从而提高性能.本文通过一个简单的例子详解这两个函数的作用.虽然Q ...

随机推荐

  1. hdu 1556 涂气球 线段树(区间更新~对区间[x,y]更新,求任意节点被更新的次数)

    Color the ball Time Limit: 9000/3000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)To ...

  2. json转译的问题

    今天遇到一个之前没遇到的情况 这边调用接口的时候,一串json数据我直接解析成php的时候,太长导致我在使用 $json = json_encode($list);转译成的时候,里面有一个数据是时间戳 ...

  3. 6.SpringMVC2

    1.视图解析 当客户端发出请求后,交由SpringMVC的DispatcherServlet处理,接着Spring会分析看哪一个HandlerMapping定义的所有请求映射中对该请求的最合理的映射, ...

  4. java——volatile的可见性不能保证线程安全

    volatile: 1.保证变量对所有线程的可见性(但是由于java里面的运算并非原子操作,导致volatile变量的运算在并发下一样是不安全的) 用代码试过,确实是这样的,原因:有可能同时多个thr ...

  5. 转 Python 操作 MySQL 数据库

    #########http://www.runoob.com/python/python-mysql.html Python 标准数据库接口为 Python DB-API,Python DB-API为 ...

  6. 性能测试工具Jmeter06-Jmeter元件作用域和执行顺序

    元件作用域 8类可被执行的元件(测试计划与线程组不属于可执行元件),这些元件中,取样器(sampler)是典型的不与其它元件发生交互作用的元件,逻辑控制器只对其子节点的取样器有效,而其它元件(配置元件 ...

  7. Neutron命令测试5

    jolin@jolin:/$ route -nKernel IP routing tableDestination Gateway Genmask Flags Metric Ref Use Iface ...

  8. 连接MySql的时候报1130的错误解决办法

    部署了一个 数据库采用Mysql的程序,sqlyog连接非本地的Mysql服务器的数据库,居然无法连接很奇怪,报1130错误,ERROR 1130: Host 192.168.3.100 is not ...

  9. MakeFile基本使用

    MakeFile Making makefile demo # Run this line when useing `make` command # default is the target whi ...

  10. 【转载】CSS3 常用四个动画(旋转、放大、旋转放大、移动)

    http://blog.csdn.net/fungleo/article/details/49848905