django的orm操作优化
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操作优化的更多相关文章
- 【Django】ORM操作#2
目录 必知必会的13条查询方法 单表查询之神奇的双下划线 一对多 ForeignKey 多对多 ManyToManyField 在Python脚本中调用Django环境 Django终端打印SQL语句 ...
- Django之ORM操作
Django之ORM操作 前言 Django框架功能齐全自带数据库操作功能,本文主要介绍Django的ORM框架 到目前为止,当我们的程序涉及到数据库相关操作时,我们一般都会这么搞: 创建数据库,设计 ...
- Django之ORM操作(聚合 分组、F Q)
Django之ORM操作(聚合 分组.F Q) 聚合 aggregate()是QuerySet的一个终止子句,也就是说,他返回一个包含一些键值对的字典,在它的后面不可以再进行点(.)操作. 键的名 ...
- Django之ORM操作(***)
Django之ORM操作(***) http请求的流程: url--> 视图view(模板+数据库) --> ORM的功能: 可以转换SQL语句,并做操作. ORM操作数据表: -创建表: ...
- 【Django】ORM操作#1
目录 一.介绍 概念 由来 优势 劣势 总结 二.Django中的ORM Django项目使用MySQL Model 快速入门 1. AutoField 2. IntegerField 3. Char ...
- Django之ORM操作(重要)
Django ORM操作 一般操作 看专业的官网文档,做专业的程序员! 必知必会13条 <1> all(): 查询所有结果 <2> get(**kwargs): 返回与所给 ...
- Django中ORM操作
ORM操作: class UserInfo(models.Model): username = models.CharField(max_length=32) password = models.Ch ...
- Django的ORM操作
ORM操作 select * from tb where id > 1 # 对应关系 models.tb.objects.filter(id__gt=1) models.tb.objects.f ...
- Django之ORM操作总结
Django之ORM总结 表结构 from django.db import models # 一对多:班级与学生 # 多对多:班级与老师 # Create your models here. #创建 ...
随机推荐
- sqli(8)
第八关:单引号GET盲注 前言:感冒了很有以后摸到靶场,如若隔世....我的天,说不定又有同学要去实习了,再看看我.啧啧啧,神的飞起来.. 盲注需要掌握一些MySQL的相关函数:length(str) ...
- Python链接liunx 带尝试
本文实例讲述了python下paramiko模块实现ssh连接登录Linux服务器的方法.分享给大家供大家参考.具体分析如下: python下有个paramiko模块,这个模块可以实现ssh登录lin ...
- [php] phar
build.php打包www目录: <?php class A{ public $a = 1; } $p = new Phar('test.phar',0,'test.phar'); $p-&g ...
- HTML5 中list 和datalist实例
<!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8" ...
- java 小数精确计算
小数精确计算 System.out.println(2.00 -1.10);//0.8999999999999999 上面的计算出的结果不是 0.9,而是一连串的小数.问题在于1.1这个数字不能被精确 ...
- 数据库(一):事务的特性与事务(在同一个 JVM 中)的传递
参考文章 https://blog.csdn.net/shuaihj/article/details/14163713 https://blog.csdn.net/shfqbluestone/arti ...
- WinForm、WPF、ASP.NET窗口生命周期
https://blog.csdn.net/s_521_h/article/details/73826928
- Python全栈开发,Day2
一.Pycharm的使用 1.创建项目 2.python调整字体大小随ctrl+鼠标滚轮上下滚动 3.python新建程序自动补全编码和环境 4.设置断点(在代码前面行号后面单击鼠标左键) 5.调试断 ...
- nginx proxy大文件上传失败问题总结
问题描述: http://www.syhuo.net ota.apk包上传正常 http://www.syhuo.net:8080 ota.apk包上传不正常 查看nginx error日志 [roo ...
- (转)YAML最最基础语法
转:https://blog.csdn.net/vincent_hbl/article/details/75411243 正如YAML所表示的YAML Ain’t Markup Language,YA ...