django_orm查询性能优化方法


Posted in Python onAugust 20, 2018

查询操作和性能优化

1.基本操作

models.Tb1.objects.create(c1='xx', c2='oo') 增加一条数据,可以接受字典类型数据 **kwargs
 
obj = models.Tb1(c1='xx', c2='oo')
obj.save()

models.Tb1.objects.get(id=123)     # 获取单条数据,不存在则报错(不建议)
models.Tb1.objects.all()        # 获取全部
models.Tb1.objects.filter(name='seven') # 获取指定条件的数据
models.Tb1.objects.exclude(name='seven') # 获取指定条件的数据


models.Tb1.objects.filter(name='seven').delete() # 删除指定条件的数据


models.Tb1.objects.filter(name='seven').update(gender='0') # 将指定条件的数据更新,均支持 **kwargs
obj = models.Tb1.objects.get(id=1)
obj.c1 = '111'
obj.save()                         # 修改单条数据

2.Foreign key的使用原因

  • 约束
  • 节省硬盘

但是多表查询会降低速度,大型程序反而不使用外键,而是用单表(约束的时候,通过代码判断)

extra

extra(self, select=None, where=None, params=None, tables=None, order_by=None, select_params=None)
  Entry.objects.extra(select={'new_id': "select col from sometable where othercol > %s"}, select_params=(1,))
  Entry.objects.extra(where=['headline=%s'], params=['Lennon'])
  Entry.objects.extra(where=["foo='a' OR bar = 'a'", "baz = 'a'"])
  Entry.objects.extra(select={'new_id': "select id from tb where id > %s"}, select_params=(1,), order_by=['-nid'])

F查询

from django.db.models import F
  models.Tb1.objects.update(num=F('num')+1)

Q查询

方式一:

Q(nid__gt=10)
  Q(nid=8) | Q(nid__gt=10)
  Q(Q(nid=8) | Q(nid__gt=10)) & Q(caption='root')

方式二:
 

con = Q()
  q1 = Q()
  q1.connector = 'OR'
  q1.children.append(('id', 1))
  q1.children.append(('id', 10))
  q1.children.append(('id', 9))
  q2 = Q()
  q2.connector = 'OR'
  q2.children.append(('c1', 1))
  q2.children.append(('c1', 10))
  q2.children.append(('c1', 9))
  con.add(q1, 'AND')
  con.add(q2, 'AND')
 
  models.Tb1.objects.filter(con)

exclude(self, *args, **kwargs)

# 条件查询
 # 条件可以是:参数,字典,Q

select_related(self, *fields)

性能相关:表之间进行join连表操作,一次性获取关联的数据。

model.tb.objects.all().select_related()
  model.tb.objects.all().select_related('外键字段')
  model.tb.objects.all().select_related('外键字段__外键字段')

prefetch_related(self, *lookups)

性能相关:多表连表操作时速度会慢,使用其执行多次SQL查询  在内存中做关联,而不会再做连表查询

# 第一次 获取所有用户表
# 第二次 获取用户类型表where id in (用户表中的查到的所有用户ID)
models.UserInfo.objects.prefetch_related('外键字段')

annotate(self, *args, **kwargs)

# 用于实现聚合group by查询
from django.db.models import Count, Avg, Max, Min, Sum
 v = models.UserInfo.objects.values('u_id').annotate(uid=Count('u_id'))
# SELECT u_id, COUNT(ui) AS `uid` FROM UserInfo GROUP BY u_id
v = models.UserInfo.objects.values('u_id').annotate(uid=Count('u_id')).filter(uid__gt=1)
# SELECT u_id, COUNT(ui_id) AS `uid` FROM UserInfo GROUP BY u_id having count(u_id) > 1
v = models.UserInfo.objects.values('u_id').annotate(uid=Count('u_id',distinct=True)).filter(uid__gt=1)
# SELECT u_id, COUNT( DISTINCT ui_id) AS `uid` FROM UserInfo GROUP BY u_id having count(u_id) > 1

extra(self, select=None, where=None, params=None, tables=None, order_by=None, select_params=None)

# 构造额外的查询条件或者映射,如:子查询
Entry.objects.extra(select={'new_id': "select col from sometable where othercol > %s"}, select_params=(1,))
Entry.objects.extra(where=['headline=%s'], params=['Lennon'])
Entry.objects.extra(where=["foo='a' OR bar = 'a'", "baz = 'a'"])
Entry.objects.extra(select={'new_id': "select id from tb where id > %s"}, select_params=(1,), order_by=['-nid'])

reverse(self):

# 倒序
 models.UserInfo.objects.all().order_by('-nid').reverse()
# 注:如果存在order_by,reverse则是倒序,如果多个排序则一一倒序

下面两个 取到的是对象,并且注意 取到的对象可以 获取其他字段(这样会再去查找该字段降低性能

defer(self, *fields):

models.UserInfo.objects.defer('username','id')
或
models.UserInfo.objects.filter(...).defer('username','id')
# 映射中排除某列数据

only(self, *fields):

# 仅取某个表中的数据
models.UserInfo.objects.only('username','id')
或
models.UserInfo.objects.filter(...).only('username','id')

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
重命名批处理python脚本
Apr 05 Python
python实现简单点对点(p2p)聊天
Sep 13 Python
深入理解Python3 内置函数大全
Nov 23 Python
Django中的ajax请求
Oct 19 Python
Python学习笔记之视频人脸检测识别实例教程
Mar 06 Python
python抓取搜狗微信公众号文章
Apr 01 Python
python验证码图片处理(二值化)
Nov 01 Python
Python使用正则实现计算字符串算式
Dec 29 Python
Python读入mnist二进制图像文件并显示实例
Apr 24 Python
matplotlib.pyplot.matshow 矩阵可视化实例
Jun 16 Python
python3.7 openpyxl 在excel单元格中写入数据实例
Sep 01 Python
解决Python 函数声明先后顺序出现的问题
Sep 02 Python
Python Requests库基本用法示例
Aug 20 #Python
Django中使用第三方登录的示例代码
Aug 20 #Python
基于Django框架利用Ajax实现点赞功能实例代码
Aug 19 #Python
分析python请求数据
Aug 19 #Python
浅谈django orm 优化
Aug 18 #Python
django连接mysql配置方法总结(推荐)
Aug 18 #Python
python画一个玫瑰和一个爱心
Aug 18 #Python
You might like
简单的页面缓冲技术
2006/10/09 PHP
php使用websocket示例详解
2014/03/12 PHP
Laravel 4 初级教程之视图、命名空间、路由
2014/10/30 PHP
PHP中trim()函数简单使用指南
2015/04/16 PHP
PHP实现链式操作的核心思想
2015/06/23 PHP
php文件管理基本功能简单操作
2017/01/16 PHP
PHP数据库编程之MySQL优化策略概述
2017/08/16 PHP
PHP使用mongoclient简单操作mongodb数据库示例
2019/02/08 PHP
关于IFRAME 自适应高度的研究
2006/07/20 Javascript
jquery 模拟雅虎首页的点击对话框效果
2010/04/11 Javascript
JavaScript中的null和undefined解析
2012/04/14 Javascript
jQuery 和 CSS 的文本特效插件集锦
2014/12/12 Javascript
jQueryMobile之Helloworld与页面切换的方法
2015/02/04 Javascript
jQuery文字横向滚动效果的实现代码
2016/05/31 Javascript
JS中正则表达式全局匹配模式 /g用法详解
2017/04/01 Javascript
require.js与bootstrap结合实现简单的页面登录和页面跳转功能
2017/05/12 Javascript
详解使用PM2管理nodejs进程
2017/10/24 NodeJs
vue 配置多页面应用的示例代码
2018/10/22 Javascript
解决vue.js中settimeout遇到的问题(时间参数短效果不稳定)
2020/07/21 Javascript
Python根据区号生成手机号码的方法
2015/07/08 Python
学习python之编写简单简单连接数据库并执行查询操作
2016/02/27 Python
python3.5使用tkinter制作记事本
2016/06/20 Python
Python部署web开发程序的几种方法
2017/05/05 Python
python日期时间转为字符串或者格式化输出的实例
2018/05/29 Python
Python装饰器的执行过程实例分析
2018/06/04 Python
用CSS3实现背景渐变的方法
2015/07/14 HTML / CSS
逼真的HTML5树叶飘落动画
2016/03/01 HTML / CSS
匡威西班牙官网:Converse西班牙
2019/10/01 全球购物
计算机专业学生的自我评价
2013/12/15 职场文书
大二学生学习个人自我评价
2014/01/19 职场文书
吃空饷专项治理工作实施方案
2014/03/04 职场文书
全国优秀教师事迹材料
2014/08/26 职场文书
竞聘书的秘诀
2019/04/02 职场文书
中学生打架《检讨书》范文
2019/08/12 职场文书
React 并发功能体验(前端的并发模式)
2021/07/01 Javascript
【海涛教你打DOTA】死灵飞龙第一视角解说
2022/04/01 DOTA