model:

先给一个简单的表结构

from django.db import models

class User(models.Model):
username=models.CharField(max_length=32)
pwd=models.CharField(max_length=64)
pd=models.ForeignKey('Depart',on_delete=models.CASCADE) class Depart(models.Model):
title=models.CharField(max_length=32)

only

需求:在user表中获取所有的username和id

a.需求: 只取n列
queryset=[{},{}] model.User.objects.all().values('id','username') queryset=[(),()]
model.User.objects.all().values_list('id','username') queryset=[obj,obj] obj只有id和name
result=model.User.objects.all().only('id','username') for item in result:
print(item.id,item.username,item.pwd)
age没有,去数据库再查一次...for循环几次就再查几次性能很低

需要注意的是:

  • 如果取了only以外的字段,虽然可以取的到,但是他内部会重新查一次表
  • 如果循环取only以外的字段就会重复多次查表操作

defer

defer跟only想对应,是排除哪些字段

result=model.User.objects.all().defer('id','username')排除哪列

select_related

###连表操作,相当于主动做join

需求:获取所有人的用户和所在部门

用户表和部门表示多对一的关系

result=model.User.objects.all()
for obj in result:
print(obj.username,obj.dp.title)

上述的ORM语句性能非常差

因为for循环一次都需要跨一次表

跨表查询的性能极低!!!!!!!!!!

优化:

result=model.User.objects.all().select_related('dp')
for item in result:
print(item.name,item.dp(Fk).title)

相当于一开始就连表了,再取的时候不需要再重新跨表操作

sql:

select * from user left join depart on user.dp.id=depart.id

需要说明的是:

  selected_related只支持FK,和OnetoOne

   如果连表多性能也越来越差.

prefetch_related

###

多次单表操作,先查询想要的数据,
然后构建条件,如:id=[1,2,3],再查询其他表的时候,根据id做条件

###

result=User.object.all().prefetch_related('dp')
for item in result:
print(item.name,item.dp.title)

sql

#select * from user
# 通过python代码获取:所有dp_id=[1,2]
# select * from depart where id in dp_id

说明:

  • 支持M2M FK One
  • 2次单表查询

ORM性能相关的更多相关文章

  1. Django之缓存+序列化+信号+ORM性能优化+验证码

    缓存 由于Django是动态网站,所有每次请求均会去数据进行相应的操作,当程序访问量大时,耗时必然会更加 明显,最简单解决方式是使用:缓存,缓存将一个某个views的返回值保存至内存或者memcach ...

  2. Django ORM性能优化 和 图片验证码

    一,ORM性能相关 1. 关联外键, 只拿一次数据 all_users = models.User.objects.all().values('name', 'age', 'role__name') ...

  3. Django之缓存、信号和图片验证码、ORM性能

    一. 缓存 1. 介绍 缓存通俗来说:就是把数据先保存在某个地方,下次再读取的时候不用再去原位置读取,让访问速度更快. 缓存机制图解 2.Django中提供了6种缓存方式 1. 开发调试 2. 内存 ...

  4. python---django中orm的使用(5)数据库的基本操作(性能相关:select_related,和prefetch_related重点)(以及事务操作)

    ################################################################## # PUBLIC METHODS THAT ALTER ATTRI ...

  5. Django的ORM那些相关操作

    一般操作 看专业的官网文档,做专业的程序员! 必知必会13条 <> all(): 查询所有结果 <> filter(**kwargs): 它包含了与所给筛选条件相匹配的对象 & ...

  6. Django之ORM那些相关操作

    一般操作 看专业的官网文档,做专业的程序员! 必知必会13条 <1> all(): 查询所有结果 <2> filter(**kwargs): 它包含了与所给筛选条件相匹配的对象 ...

  7. Django ORM那些相关操作zi

    Django ORM那些相关操作   一般操作 看专业的官网文档,做专业的程序员! 必知必会13条 <1> all(): 查询所有结果 <2> filter(**kwargs) ...

  8. IIS性能相关的配置、命令

    IIS性能相关的配置.命令 应用程序池回收 不要使用缺省的“固定时间间隔(分钟)”:1740(即29小时),建议改为0 可以根据实际情况设置特定时间回收,比如凌晨4点 最大工作进程数 可以根据实际情况 ...

  9. 用事实说话,成熟的ORM性能不是瓶颈,灵活性不是问题:EF5.0、PDF.NET5.0、Dapper原理分析与测试手记

    [本文篇幅较长,可以通过目录查看您感兴趣的内容,或者下载格式良好的PDF版本文件查看] 目录 一.ORM的"三国志"    2 1,PDF.NET诞生历程    2 2,Linq2 ...

随机推荐

  1. Cocos2d-x 3.2 大富翁游戏项目开发-第七部分 获取角色路径_2

    在编写获取路径方法前,我们先把角色须要的动画文件载入进来,角色的文件为png 和 plist格式. player1_anim.png.plist             player1_anim.pn ...

  2. 【oracle11g,17】存储结构: 段的类型,数据块(行连接、行迁移,块头),段的管理方式,高水位线

    一.段的类型: 1.什么是段:段是存储单元. 1.段的类型有: 表 分区表 簇表 索引 索引组织表(IOT表) 分区索引 暂时段 undo段 lob段(blob ,clob) 内嵌表(record类型 ...

  3. 阻止右键菜单(阻止默认事件)&&跟随鼠标移动(大图展示)&&自定义右键菜单

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  4. passwd(总结)

    1.当前用户是root root用户修改密码 ,直接 passwd[不要输入当前用户密码] 如果修改其他用户密码,需要 passwd 用户名 如: passwd sc 短短的密码,如123也能通过,因 ...

  5. VMware下的ubuntu12.04不识别usb设备问题的解决方法

    情况一:U盘通过USB连接到Ubuntu后,点击VM—removable devices,无usb信息? 解决方法: 在“服务”中启动“VMware USB Arbitration Service”服 ...

  6. const readonly

    静态常量(compile-time constants)静态常量是指编译器在编译时候会对常量进行解析,并将常量的值替换成初始化的那个值. 动态常量(runtime constants)而动态常量的值则 ...

  7. nginx 使用ngx_cache_purge清除缓存

    location ~ ^/myclear(/.*) { allow 10.0.0.0/8; allow 10.28.100.0/24; allow 127.0.0.1; deny all;   pro ...

  8. Laravel5.4使用Memcached缓存

    修改默认的缓存驱动 Laravel默认的缓存驱动是file,想要切换为Memcached需要修改.env文件.把CACHE_DRIVER=file改为CACHE_DRIVER=memcached,改好 ...

  9. atitit.bsh BeanShell 的动态脚本使用java

    atitit.bsh BeanShell 的动态脚本使用java 1.1. BeanShell是一个小巧免费的JAVA源码解释器 ,支持对象式的脚本语言特性,亦可嵌入到JAVA源代码中. 亦可嵌入到J ...

  10. Python中运算符与while初识

    一.运算符 1.算术运算: 2.比较运算: 3.赋值运算: 4.位运算: 注: ~  举例: ~5 = -6  解释: 将二进制数+1之后乘以-1,即~x = -(x+1),-(101 + 1) = ...