django的orm操作优化

models.py

from django.db import models

class Author(models.Model):
name = models.CharField(max_length=16)
age = models.IntegerField() class Book(models.Model):
authors = models.ManyToManyField('Author')
pubs = models.ForeignKey("Publish",on_delete=models.CASCADE)
title = models.CharField(max_length=32)
pubtime = models.DateField() class Publish(models.Model):
name = models.CharField(max_length=32)

优化一:尽量不查对象,能用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. 【Django】ORM操作#2

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

  2. Django之ORM操作

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

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

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

  4. Django之ORM操作(***)

    Django之ORM操作(***) http请求的流程: url--> 视图view(模板+数据库) --> ORM的功能: 可以转换SQL语句,并做操作. ORM操作数据表: -创建表: ...

  5. 【Django】ORM操作#1

    目录 一.介绍 概念 由来 优势 劣势 总结 二.Django中的ORM Django项目使用MySQL Model 快速入门 1. AutoField 2. IntegerField 3. Char ...

  6. Django之ORM操作(重要)

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

  7. Django中ORM操作

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

  8. Django的ORM操作

    ORM操作 select * from tb where id > 1 # 对应关系 models.tb.objects.filter(id__gt=1) models.tb.objects.f ...

  9. Django之ORM操作总结

    Django之ORM总结 表结构 from django.db import models # 一对多:班级与学生 # 多对多:班级与老师 # Create your models here. #创建 ...

随机推荐

  1. Apache Mesos 官方文档 V1.0

    Apache Mesos 官方文档 V1.0 2016-11-07 中文版:http://mesos.mydoc.io/ gitBook :https://www.gitbook.com/book/m ...

  2. 零点.Net Core 接触

    一.Program.cs类与Startup类 1.一切从Main开始,Main方法包含了是整个应用程序的入口 ASP.NET Core应用程序可以配置和启动主机(Host). 主机负责应用程序启动和生 ...

  3. 2014-03-01 春季PAT 1073-1076解题报告

    今天下午的PAT考试状态不理想,回来怒刷了一遍,解题报告如下: 1073. Scientific Notation (20) 基本模拟题,将一长串的科学计数转换为普通的数字表示方式.思路是是数组存储输 ...

  4. ps:建立规则选区

    在前面的内容中,我们初步接触了色彩调整工具中的“色相/饱和度”工具[CTRL U],现在我们可以很容易地改变图像的色相.将如下左图的色相改为-100,形成如下中图的效果.但是这样做有一个局限,那就是只 ...

  5. Ansible笔记(1)---基本概念

    一.ansible的作用以及工作结构 1.1.ansible简介: ansible是新出现的自动化运维工具,基于Python开发,集合了众多运维工具(puppet.cfengine.chef.func ...

  6. 2018-08-15-weekly

    Algorithm 5. Longest Palindromic Substring What 给定一个字符串s,找到s中最长的回文子字符串. 给定s的最大长度为1000. How 这是一道比较经典的 ...

  7. alert(1) to win

    一. function escape(s) { return '<script>console.log("'+s+'");</script>'; } 两种思 ...

  8. 定位公众号页面,跳转之后 vuejs 失效问题

    是第一个页面的. data () { }, 写成了这样,没写返回 {} 5555~. 网页中死活可以,微信中死活不行. data () { return {} },

  9. Element ui 上传文件组件(单文件上传) 点击提交 没反应

    element ui 第一次上传文件后 上传其他文件再次点击不再次提交 需要使用 clearFiles 清空已上传文件列表 这时候在次点击 上传按钮 就会惊喜的发现 可以上传了使用方法 this.$r ...

  10. NVMe固态硬盘工具箱使用说明

    https://www.bilibili.com/read/cv562989/ 浦科特NVMe固态硬盘工具箱使用说明 数码 2018-6-7 687阅读7点赞3评论 浦科特已经推出针对NVMe固态硬盘 ...