django select_related()和反射结合
对于有外键关联的表,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()和反射结合的更多相关文章
- pythonのdjango select_related 和 prefetch_related()
在数据库有外键的时候,使用select_related() 和 prefetch_related() 可以很好的减少数据库请求次数,从而提高性能. (1)select_related()当执行它的查询 ...
- Django models对象的select_related方法(减少查询次数)
表结构 先创建一个新的app python manage.py startapp test01 在settings.py注册一下app INSTALLED_APPS = ( 'django.contr ...
- Django中的QuerySet查询优化之select_related
在数据库有外键的时候,使用 select_related() 和 prefetch_related() 可以很好的减少数据库请求的次数,从而提高性能.本文通过一个简单的例子详解这两个函数的作用.虽然Q ...
- Django的 select_related 和 prefetch_related 函数对 QuerySet 查询的优化(三)
4.一些实例 如果我们想要获得所有家乡是湖北的人,最无脑的做法是先获得湖北省,再获得湖北的所有城市,最后获得故乡是这个城市的人.就像这样: 1 2 3 4 5 >>> hb = Pr ...
- Django的 select_related 和 prefetch_related 函数对 QuerySet 查询的优化(二)
3. prefetch_related() 对于多对多字段(ManyToManyField)和一对多字段,可以使用prefetch_related()来进行优化.或许你会说,没有一个叫OneToMan ...
- Django的 select_related 和 prefetch_related 函数对 QuerySet 查询的优化(一)
在数据库有外键的时候,使用 select_related() 和 prefetch_related() 可以很好的减少数据库请求的次数,从而提高性能.本文通过一个简单的例子详解这两个函数的作用.虽然Q ...
- Python 实现接口类的两种方式+邮件提醒+动态导入模块+反射(参考Django中间件源码)
实现接口类的两种方式 方式一 from abc import ABCMeta from abc import abstractmethod class BaseMessage(metaclass=AB ...
- python框架之Django(6)-查询优化之select_related&prefetch_related
准备 定义如下模型 from django.db import models # 省份 class Province(models.Model): name = models.CharField(ma ...
- Django框架详细介绍---ORM相关操作---select_related和prefetch_related函数对 QuerySet 查询的优化
Django的 select_related 和 prefetch_related 函数对 QuerySet 查询的优化 引言 在数据库存在外键的其情况下,使用select_related()和pre ...
随机推荐
- Linux下用node-inspector实现NodeJS远程调试开发
1.首先安装 node-inspector npm install -g node-inspector -g表示全局安装,如果像我一样安装失败,再试几次,npm偶尔就会这样抽风... 这一步是关键的, ...
- pthread mutex
pthead_mutex_t mutex; 1:create: pthread_mutex_init(pthread_mutex_t* mutex, const pthread_mutexattr_t ...
- 《马哥出品高薪linux运维教程》wingkeung学习笔记-linux基础入门课程
计算机原理概念: 1.CPU和内存中的存储单元通信线路称为总线(BUS),总线是被指令和数据复用的,所以也称为前端总线. 2.计算机中计算频率的时间标准即晶体振荡器原理,精确计算时间长度,根据相同的时 ...
- css实现三角形标
.iszb{ position: absolute;top: -75px;right:-75px;text-align: center;color: red; width: 150px;height: ...
- centos7 安装 nvm
cd 到 /usr/local下创建nvm文件夹,并进入nvm目录, 执行命令: wget -qO- https://raw.githubusercontent.com/creationix/nvm/ ...
- Vue中 等待DOM或者数据完成 在执行 --this.$nextTick()
虽然 Vue.js 通常鼓励开发人员沿着“数据驱动”的方式思考,避免直接接触 DOM,但是有时我们确实要这么做.比如一个新闻滚动的列表项.如果在这里需要操作dom, 应该是等待 Vue 完成更新 DO ...
- mongodb的管理员和安全认证
超级管理员 为了更安全的访问mongodb,需要访问者提供用户名和密码,于是需要在mongodb中创建用户 采用了角色-用户-数据库的安全管理方式 常用系统角色如下: root:只在admin数据库中 ...
- mongodb的Limit|skip|投影|排序|消除重复
Limit 方法limit():用于读取指定数量的文档 语法: db.集合名称.find().limit(NUMBER) 参数NUMBER表示要获取文档的条数 如果没有指定参数则显示集合中的所有文档 ...
- springBoot属性配置和使用
Spring Boot 属性配置和使用 1.添加属性文件 application.properties (名字固定) 2.访问端口生效 3.更多配置参考 # ===================== ...
- [Android] SeekBar---可拖动进度条
SeekBar---可拖动进度条 ()setMax //设置SeekBar最大数值 ()setProgress //设置SeekBar当前数值 ()setSecondaryProgress//设置Se ...