提升orm操作性能注意的点

优化一:尽量不查对象,能用values就是用values

直接使用对象查询的结果是5条sql语句

def youhua(request):
# 使用对象查
obj_list = models.Book.objects.all()
for obj in obj_list:
print(obj.title,obj.pubs.name) return render(request,"youhua.html")

使用values查询只执行了1条sql,会自动进行连表查询

def youhua(request):
# 使用values
obj_list = models.Book.objects.values('title', 'pubs__name')
for obj in obj_list:
print(obj['title'], obj['pubs__name']) return render(request,"youhua.html")

优化二:select_related('classes')

使用select_related('classes')

适用于:多对一 ,一对一查询添加select_related()方法,括号中是外键字段 。会进行连表查询

def youhua(request):
# 使用对象查
obj_list = models.Book.objects.all().select_related('pubs')
for obj in obj_list:
print(obj.title, obj.pubs.name) return render(request,"youhua.html")

优化三:prefetch_related()

使用prefetch_related(),多对一,

def youhua(request):

    obj_list = models.Book.objects.all().prefetch_related("pubs")
for obj in obj_list:
print(obj.title,obj.pubs.name) return render(request,"youhua.html")

使用prefetch_related(),多对多,

def youhua(request):

    obj_list = models.Book.objects.all()
for obj in obj_list:
print(obj.title,obj.authors.all()) return render(request,"youhua.html")

def youhua(request):

    obj_list = models.Book.objects.all().prefetch_related("authors")
for obj in obj_list:
print(obj.title,obj.authors.all()) return render(request,"youhua.html")

优化四:only()指定查询字段

直接查询的情况,会将所有字段都查询出来

def youhua(request):

    obj_list = models.Book.objects.all()
for obj in obj_list:
print(obj.title) return render(request,"youhua.html")

查询时指定某些字段查询,使用only指定字段只会查我们需要的那个字段。

def youhua(request):

    obj_list = models.Book.objects.all().only('title')
for obj in obj_list:
print(obj.title) return render(request,"youhua.html")

优化五:defer() 查询时指定排除某些字段和only相反

如果我们需要的字段较多,不需要的较少,可以使用defer排除

def youhua(request):

    obj_list = models.Book.objects.all().defer('title')
for obj in obj_list:
print(obj.pubtime) return render(request,"youhua.html")

注:如果排除的字段,还要查会增加查询负担,当然查询指定字段之外的字段也会增加查询负担。

Django中ORM操作提升性能的更多相关文章

  1. 1122 django中orm操作

    目录 1. 静态文件的配置 手动静态文件的访问资源 静态文件的动态绑定 2.request方法 2.1 请求方式 2.2 获取前端的请求方式 request.method 2.3 request方法 ...

  2. Django中ORM操作

    ORM操作: class UserInfo(models.Model): username = models.CharField(max_length=32) password = models.Ch ...

  3. 6月20日 Django中ORM介绍和字段、字段参数、相关操作

    一.Django中ORM介绍和字段及字段参数 二.Django ORM 常用字段和参数 三.Django ORM执行原生SQL.在Python脚本中调用Django环境.Django终端打印SQL语句 ...

  4. Django之ORM操作

    Django之ORM操作 前言 Django框架功能齐全自带数据库操作功能,本文主要介绍Django的ORM框架 到目前为止,当我们的程序涉及到数据库相关操作时,我们一般都会这么搞: 创建数据库,设计 ...

  5. django中orm使用的注意事项

    必备小知识点 <1> all(): 查询所有结果 <2> get(**kwargs): 返回与所给筛选条件相匹配的对象,返回结果有且只有一个,如果符合筛选条件的对象超过一个或者 ...

  6. 【Django】ORM操作#2

    目录 必知必会的13条查询方法 单表查询之神奇的双下划线 一对多 ForeignKey 多对多 ManyToManyField 在Python脚本中调用Django环境 Django终端打印SQL语句 ...

  7. Django中ORM介绍和字段及其参数

    ORM介绍 ORM概念 对象关系映射(Object Relational Mapping,简称ORM)模式是一种为了解决面向对象与关系数据库存在的互不匹配的现象的技术. 简单的说,ORM是通过使用描述 ...

  8. Django之ORM操作(聚合 分组、F Q)

    Django之ORM操作(聚合 分组.F Q) 聚合 aggregate()是QuerySet的一个终止子句,也就是说,他返回一个包含一些键值对的字典,在它的后面不可以再进行点(.)操作.   键的名 ...

  9. Django中ORM介绍和字段及字段参数 Object Relational Mapping(ORM)

    Django中ORM介绍和字段及字段参数   Object Relational Mapping(ORM) ORM介绍 ORM概念 对象关系映射(Object Relational Mapping,简 ...

随机推荐

  1. 美团小程序框架mpvue入门教程

    mpvue是一个使用 Vue.js 开发小程序的前端框架.框架基于 Vue.js 核心,mpvue 修改了 Vue.js 的 runtime 和 compiler 实现,使其可以运行在小程序环境中,从 ...

  2. jQuery文档操作之克隆操作

    语法: $(selector).clone(); 解释:克隆匹配的DOM元素 $("button").click(function(event) { //1.clone():克隆匹 ...

  3. HDU 5795 A Simple Nim ——(Nim博弈 + 打表)

    题意:在nim游戏的规则上再增加了一条,即可以将任意一堆分为三堆都不为0的子堆也视为一次操作. 分析:打表找sg值的规律即可. 感想:又学会了一种新的方法,以后看到sg值找不出规律的,就打表即可~ 打 ...

  4. Linux 如何查看端口与进程占用情况

    1 lsof -i:port  查看端口使用情况 lsof -i 如果出现 command not found,直接yum install lsof即可. (1) lsof -i lsof -i 用以 ...

  5. bedtools 用法大全

    原文:https://cloud.tencent.com/developer/article/1078324 前言: bedtools等工具号称是可以代替普通的生物信息学数据处理工程师的!我这里用一个 ...

  6. win7远程连接ubuntu,出现灰屏解决方法

      问题: win7远程虚拟机ubuntu 12.04出现灰色屏幕 打开windows自带的远程桌面连接.输入ubuntu虚拟机的IP地址 可以连接上,输入username和password 点击OK ...

  7. Python是否存在方法方法重载及是否可以不显示声明初始化方法

    一.python中是否存在方法重载 对java有了解的程序员都知道,java中存在构造方法重载和普通方法重载,重载指的是方法名相同,参数列表不同的多个方法.python中是否也支持这两种方法重载,测试 ...

  8. java使用解压zip文件,文件名乱码解决方案

    File outFileDir = new File(outDir);if (!outFileDir.exists()) { boolean isMakDir = outFileDir.mkdirs( ...

  9. 发布Rest风格的WebService的SpringBoot极简例子

    JDK:1.8.0_212 IDE:STS4(Spring Tool Suit4 Version: 4.3.2.RELEASE) 工程下载:https://files.cnblogs.com/file ...

  10. 离线安装nuget包EPPlus

    1先去https://www.nuget.org/packages/EPPlus/4.1.0下载,epplus.4.1.0.nupkg 2找到本地文件位置:H:\DOWNLOAD\ 3在vs的程序包管 ...