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查找相似单词的方法
Mar 05 Python
Python两个整数相除得到浮点数值的方法
Mar 18 Python
Python实现SVN的目录周期性备份实例
Jul 17 Python
VTK与Python实现机械臂三维模型可视化详解
Dec 13 Python
Django中间件工作流程及写法实例代码
Feb 06 Python
使用Python搭建虚拟环境的配置方法
Feb 28 Python
Python 硬币兑换问题
Jul 29 Python
Linux下通过python获取本机ip方法示例
Sep 06 Python
python画蝴蝶曲线图的实例
Nov 21 Python
使用python的turtle绘画滑稽脸实例
Nov 21 Python
利用python对excel中一列的时间数据更改格式操作
Jul 14 Python
Python趣味挑战之教你用pygame画进度条
May 31 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
smarty表格换行实例
2014/12/15 PHP
php简单操作mysql数据库的类
2015/04/16 PHP
php简单统计中文个数的方法
2016/09/30 PHP
php中bind_param()函数用法分析
2017/03/28 PHP
javascript中的undefined 与 null 的区别  补充篇
2010/03/17 Javascript
jquery及原生js获取select下拉框选中的值示例
2013/10/25 Javascript
js确认框confirm()用法实例详解
2016/01/07 Javascript
js事件冒泡、事件捕获和阻止默认事件详解
2016/08/04 Javascript
使用开源工具制作网页验证码的方法
2016/10/17 Javascript
js实现图片加载淡入淡出效果
2017/04/07 Javascript
vue-router 导航钩子的具体使用方法
2017/08/31 Javascript
Vue中render方法的使用详解
2018/01/26 Javascript
Vue动态组件和异步组件原理详解
2019/05/06 Javascript
解决Antd Table组件表头不对齐的问题
2020/10/27 Javascript
vue下拉刷新组件的开发及slot的使用详解
2020/12/23 Vue.js
Vue实现省市区三级联动
2020/12/27 Vue.js
用Python实现服务器中只重载被修改的进程的方法
2015/04/30 Python
Python中的自省(反射)详解
2015/06/02 Python
python中argparse模块用法实例详解
2015/06/03 Python
Python贪吃蛇游戏编写代码
2020/10/26 Python
Python如何快速实现分布式任务
2017/07/06 Python
python中的随机函数小结
2018/01/27 Python
详解Python中的正则表达式
2018/07/08 Python
python编程使用协程并发的优缺点
2018/09/20 Python
Python打开文件,将list、numpy数组内容写入txt文件中的方法
2018/10/26 Python
python多任务及返回值的处理方法
2019/01/22 Python
python实现AES加密与解密
2019/03/28 Python
详解python破解zip文件密码的方法
2020/01/13 Python
Python脚本导出为exe程序的方法
2020/03/25 Python
HTML5 语音搜索(淘宝店语音搜素)
2013/01/03 HTML / CSS
Genny意大利官网:意大利高级时装品牌
2020/04/15 全球购物
党的群众路线教育实践活动个人对照检查材料(公安)
2014/11/05 职场文书
优秀教师事迹材料
2014/12/15 职场文书
先进工作者个人总结
2015/02/15 职场文书
我们的节日中秋节活动总结
2015/03/23 职场文书
2015年派出所民警工作总结
2015/04/24 职场文书