对于有外键关联的表,select_related()会自动进行多变关联;

ret = models.UserInfo.objects.all().select_related()
print ret.query SQL为:
SELECT
"app01_userinfo"."id",
"app01_userinfo"."user_type_id",
"app01_userinfo"."username",
"app01_userinfo"."age",
"app01_usertype"."id",
"app01_usertype"."caption"
FROM "app01_userinfo" INNER JOIN "app01_usertype" ON ( "app01_userinfo"."user_type_id" = "app01_usertype"."id" )

  

针对单独查询出来的一条字段的对象,select_related()只支持多对多的对象:

>>> from jasset.models import Asset, IDC, AssetGroup, ASSET_TYPE, ASSET_STATUS
>>> aa = Asset.objects.all()
>>> aa
[<Asset: 172.16.158.2>, <Asset: 172.16.158.3>, <Asset: 10.88.10.5>, <Asset: 172.16.10.4>, <Asset: 10.88.10.6>, <Asset: 10.88.10.8>, <Asset: 10.88.10.7>, <Asset: 192.168.1.4>, <Asset: 192.168.1.3>, <Asset: 192.168.1.11>, <Asset: 192.168.1.1>, <Asset: 10.90.1.1>, <Asset: 192.168.1.9>, <Asset: 10.90.1.2>, <Asset: 192.168.1.13>, <Asset: 192.168.1.5>, <Asset: 192.168.1.6>, <Asset: 192.168.1.7>, <Asset: 192.168.1.9>, <Asset: 192.168.1.10>, '...(remaining elements truncated)...'] >>> bb = aa[0] >>> bb.idc
<IDC: 莱锦>
>>> hasattr(bb.idc,'select_related')
False
>>> hasattr(bb.group,'select_related') #group字段是多对多关联的
True

  

django orm与反射的结合:

#通过反射直接获取字段的值
>>> for n in aa:
... print getattr(n,'hostname')
...
莱锦基础服务_158.2
莱锦docker-3_158.3
莱锦VirtualBox-1_10.5
莱锦基础服务_10.4
莱锦docker-1_10.6
莱锦docker-2_10.8
莱锦VirtualBox-1_10.7
4、5层AC控制器_192.168.1.4
4、5层AC控制器_192.168.1.3
4层接入交换机_F4-SW3_192.168.1.11
4、5层出口路由器_192.168.1.1
5层核心交换机_10.90.1.1
4层汇聚交换机_F4-SW1_192.168.1.9
1层核心交换机
5层POE交换机_192.168.1.13
5层接入交换机_192.168.1.5
5层接入交换机_192.168.1.6
5层接入交换机_192.168.1.7
4层汇聚交换机_192.168.1.9
5层接入交换机_192.168.1.10
5层接入交换机_192.168.1.11
5层接入交换机_192.168.1.12
4层POE交换机_192.168.1.8
3层汇聚交换机_192.168.4.31
3层POE交换机_192.168.4.30
1层AC控制器_192.168.4.3
1层AC控制器_192.168.4.4
1层接入交换机_192.168.4.10
1层接入交换机_192.168.4.11
1、3层出口路由器_192.168.4.1

  

>>> for n in bb.group.select_related():
... getattr(n,'name')
...
u'\u57fa\u7840\u670d\u52a1'
>>> for n in bb.group.select_related():
...
... print getattr(n,'name')
...
基础服务
>>> bb.group.select_related()
[<AssetGroup: 基础服务>]
>>>
>>>
>>>
>>> bb.group.select_related()[0]
<AssetGroup: 基础服务>
>>>
>>> getattr(bb.group.select_related()[0],'name')
u'\u57fa\u7840\u670d\u52a1

  

注意:select_related(),查询的对象是列表,类似于filter查询出来的结果;

django select_related()和反射结合的更多相关文章

  1. pythonのdjango select_related 和 prefetch_related()

    在数据库有外键的时候,使用select_related() 和 prefetch_related() 可以很好的减少数据库请求次数,从而提高性能. (1)select_related()当执行它的查询 ...

  2. Django models对象的select_related方法(减少查询次数)

    表结构 先创建一个新的app python manage.py startapp test01 在settings.py注册一下app INSTALLED_APPS = ( 'django.contr ...

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

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

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

    4.一些实例 如果我们想要获得所有家乡是湖北的人,最无脑的做法是先获得湖北省,再获得湖北的所有城市,最后获得故乡是这个城市的人.就像这样: 1 2 3 4 5 >>> hb = Pr ...

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

    3. prefetch_related() 对于多对多字段(ManyToManyField)和一对多字段,可以使用prefetch_related()来进行优化.或许你会说,没有一个叫OneToMan ...

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

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

  7. Python 实现接口类的两种方式+邮件提醒+动态导入模块+反射(参考Django中间件源码)

    实现接口类的两种方式 方式一 from abc import ABCMeta from abc import abstractmethod class BaseMessage(metaclass=AB ...

  8. python框架之Django(6)-查询优化之select_related&prefetch_related

    准备 定义如下模型 from django.db import models # 省份 class Province(models.Model): name = models.CharField(ma ...

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

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

随机推荐

  1. NT平台ADSL拨号连接密码恢复原理

    NT平台拨号连接密码恢复原理 创建时间:2004-11-08 更新时间:2004-11-12文章属性:原创文章提交:eyas (eyas_at_xfocus.org)NT平台拨号连接密码恢复原理Aut ...

  2. Chapter1:Qt概念

    信号和槽1.信号与槽机制的连接方式(1):一个信号可以与另一个信号相连,代码如下: connect(Object1,SIGNAL(signal1),Object2,SIGNAL(signal1)); ...

  3. 1449 - The user specified as a definer ('test'@'%') does not exist

    最近在做一个项目,由于服务器切换,所以需要将原有服务器的mysql数据表以及存储过程导入到另一个服务器的mysql数据库中.导入完成之后以为一切是那么的简单,却没有想到总还是出现了一些莫名其妙的问题. ...

  4. 小众Python库介绍

    Python 是世界上发展最快的编程语言之一.它一次又一次地证明了自己在开发人员和跨行业的数据科学中的实用性.Python 及其机器学习库的整个生态系统使全世界的用户(无论新手或老手)都愿意选择它.P ...

  5. solr 忽略大小写

    1.types标签下加入如下fieldType <fieldType name="str_lower" class="solr.TextField" so ...

  6. jsfiddle修改个人头像

    找了半天终于知道修改jsfiddle头像的方法了~ JsFiddle将Gravatar - 全球认可的头像用于个人资料图片.必须在这里改变你的头像,它也会在jsFiddle中自动更新. 注意,两者的注 ...

  7. vue2.0 slot用法

    学习vue.js也有一段时间了,关于slot这一块,也看了不少次了,总感觉有点迷迷糊糊,不知其然也不知其所以然,抽出一段完整的时间,再一次仔细学习.稍微有点理解了,在此稍作记录,好记性不如烂笔头嘛! ...

  8. 正则表达式-使用说明Regular Expression How To (Perl, Python, etc)

    notepad++ wiki about regular expression 正则表达式-使用说明Regular Expression How To (Perl, Python, etc) http ...

  9. Java Base64 加密/解密

    Base64常用来表示字串加密过后的内容,使用Java 程式语言来实作Base64的编码与解码功能 1.在Java上做Base64的编码与解码,会使用到JDK里sun.misc套件下的BASE64En ...

  10. 学习笔记:jqchart

    (Highcharts 167K:  ECharts 354K: jqChart 240K),如果用于网络,Highchart最小 jqchart 国外的一个图表库 挺漂亮的 http://www.j ...