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 15 Python
Python多线程编程(七):使用Condition实现复杂同步
Apr 05 Python
使用PDB简单调试Python程序简明指南
Apr 25 Python
Python制作爬虫采集小说
Oct 25 Python
windows下ipython的安装与使用详解
Oct 20 Python
Python自动发邮件脚本
Mar 31 Python
python交互式图形编程实例(三)
Nov 17 Python
Python简单生成随机姓名的方法示例
Dec 27 Python
python用post访问restful服务接口的方法
Dec 07 Python
python石头剪刀布小游戏(三局两胜制)
Jan 20 Python
Django自带日志 settings.py文件配置方法
Aug 30 Python
利用python3 的pygame模块实现塔防游戏
Dec 30 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
PHP中的Streams详细介绍
2014/11/12 PHP
用javascript实现兼容IE7的类库 IE7_0_9.zip提供下载
2007/08/08 Javascript
jquery slibings选取同级其他元素的实现代码
2013/11/15 Javascript
javascript新建标签,判断键盘输入,以及判断焦点(示例代码)
2013/11/25 Javascript
Jquery Ajax方法传值到action的方法
2014/05/11 Javascript
jQuery中ajax的get()方法用法实例
2014/12/26 Javascript
Js和JQuery获取鼠标指针坐标的实现代码分享
2015/05/25 Javascript
jQuery实现向下滑出的平滑下拉菜单效果
2015/08/21 Javascript
JavaScript常用函数工具集:lao-utils
2016/03/01 Javascript
深入浅析JavaScript中的作用域和上下文
2016/03/26 Javascript
Vue.js创建Calendar日历效果
2016/11/03 Javascript
微信小程序 闭包写法详细介绍
2016/12/14 Javascript
图文详解Javascript中的上下文和作用域
2017/02/15 Javascript
基于Vue实现页面切换左右滑动效果
2020/06/29 Javascript
JavaScript编写的网页小游戏,很给力
2017/08/18 Javascript
Django中使用jquery的ajax进行数据交互的实例代码
2017/10/15 jQuery
JavaScript递归函数定义与用法实例分析
2019/01/24 Javascript
ant-design-vue 快速避坑指南(推荐)
2020/01/21 Javascript
Python计算回文数的方法
2015/03/11 Python
基于Python3 逗号代码 和 字符图网格(详谈)
2017/06/22 Python
利用Python如何实现一个小说网站雏形
2018/11/23 Python
解决python字典对值(值为列表)赋值出现重复的问题
2019/01/20 Python
Python利用pandas处理Excel数据的应用详解
2019/06/18 Python
python里dict变成list实例方法
2019/06/26 Python
Django 数据库同步操作技巧详解
2019/07/19 Python
浅谈matplotlib 绘制梯度下降求解过程
2020/07/12 Python
python3让print输出不换行的方法
2020/08/24 Python
Tripadvisor新西兰:阅读评论,比较价格和酒店预订
2018/02/10 全球购物
日本高岛屋百货购物网站:TAKASHIMAYA
2019/03/24 全球购物
给排水工程师岗位职责
2013/11/21 职场文书
汽车维修工岗位职责
2014/02/12 职场文书
前处理班长职位说明书
2014/03/01 职场文书
西安导游词
2015/02/12 职场文书
2015年仓库管理员工作总结
2015/04/21 职场文书
个人借条范本
2015/05/25 职场文书
2019XX公司员工考核管理制度!
2019/08/07 职场文书