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 IDLE加上自动补全和历史功能
Nov 30 Python
分析Python编程时利用wxPython来支持多线程的方法
Apr 07 Python
Python下载指定页面上图片的方法
May 12 Python
利用Python实现命令行版的火车票查看器
Aug 05 Python
Python3.x对JSON的一些操作示例
Sep 01 Python
python编程线性回归代码示例
Dec 07 Python
Django model序列化为json的方法示例
Oct 16 Python
python爬取指定微信公众号文章
Dec 20 Python
python wav模块获取采样率 采样点声道量化位数(实例代码)
Jan 22 Python
matlab中imadjust函数的作用及应用举例
Feb 27 Python
Django之choices选项和富文本编辑器的使用详解
Apr 01 Python
TensorFlow低版本代码自动升级为1.0版本
Feb 20 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(3) php 函数
2010/02/15 PHP
PHP里8个鲜为人知的安全函数分析
2014/12/09 PHP
详解PHP的Yii框架中的Controller控制器
2016/03/29 PHP
php实现微信企业付款到个人零钱功能
2018/10/09 PHP
根据判断浏览器类型屏幕分辨率自动调用不同CSS的代码
2007/02/22 Javascript
javascript使用正则控制input输入框允许输入的值方法大全
2014/06/19 Javascript
Jquery中CSS选择器用法分析
2015/02/10 Javascript
javascript中Math.random()使用详解
2015/04/15 Javascript
javascript自定义右键弹出菜单实现方法
2015/05/25 Javascript
如何使用jquery修改css中带有!important的样式属性
2016/04/28 Javascript
javascript实现简单的ajax封装示例
2016/12/28 Javascript
微信小程序 地图map详解及简单实例
2017/01/10 Javascript
微信小程序按钮点击动画效果的实现
2019/09/04 Javascript
layer插件实现在弹出层中弹出一警告提示并关闭弹出层的方法
2019/09/24 Javascript
vue仿淘宝滑动验证码功能(样式模仿)
2019/12/10 Javascript
JavaScript简单编程实例学习
2020/02/14 Javascript
ES5 模拟 ES6 的 Symbol 实现私有成员功能示例
2020/05/06 Javascript
javascript实现扫雷简易版
2020/08/18 Javascript
在Django框架中编写Contact表单的教程
2015/07/17 Python
python简单实例训练(21~30)
2017/11/15 Python
对python数据切割归并算法的实例讲解
2018/12/12 Python
Django文件存储 自己定制存储系统解析
2019/08/02 Python
python使用正则表达式(Regular Expression)方法超详细
2019/12/30 Python
基于python实现简单C/S模式代码实例
2020/09/14 Python
用HTML5实现手机摇一摇的功能的教程
2012/10/30 HTML / CSS
便携式太阳能系统的创新者:GOAL ZERO
2018/02/04 全球购物
物业管理大学生个人的自我评价
2013/10/10 职场文书
学校四群教育实施方案
2014/06/12 职场文书
医生见习报告范文
2014/11/03 职场文书
商务司机岗位职责
2015/04/10 职场文书
音乐之声观后感
2015/06/04 职场文书
机器人总动员观后感
2015/06/09 职场文书
焦裕禄纪念馆观后感
2015/06/09 职场文书
2016年读书月活动总结范文
2016/04/06 职场文书
MySQL不使用order by实现排名的三种思路总结
2021/06/02 MySQL
Python函数对象与闭包函数
2022/04/13 Python