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写的Socks5协议代理服务器
Aug 06 Python
Python中的random()方法的使用介绍
May 15 Python
Python用模块pytz来转换时区
Aug 19 Python
解决python升级引起的pip执行错误的问题
Jun 12 Python
Python zip函数打包元素实例解析
Dec 11 Python
python next()和iter()函数原理解析
Feb 07 Python
Jupyter Notebook远程登录及密码设置操作
Apr 10 Python
keras中模型训练class_weight,sample_weight区别说明
May 23 Python
使用opencv中匹配点对的坐标提取方式
Jun 04 Python
详解pycharm配置python解释器的问题
Oct 15 Python
pytorch实现ResNet结构的实例代码
May 17 Python
Python调用腾讯API实现人脸身份证比对功能
Apr 04 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
让这部DC动画新作刷新你的认知
2020/03/03 欧美动漫
codeigniter中测试通过的分页类示例
2014/04/17 PHP
PHP设计模式之模板方法模式定义与用法详解
2018/04/02 PHP
thinkPHP框架实现类似java过滤器的简单方法示例
2018/09/05 PHP
PHP智能识别收货地址信息实例
2019/01/05 PHP
浅谈PHP各环境下的伪静态配置
2019/03/13 PHP
在laravel中实现ORM模型使用第二个数据库设置
2019/10/24 PHP
javascript数组快速打乱重排的方法
2014/01/02 Javascript
JS取得绝对路径的实现代码
2015/01/16 Javascript
js基于setTimeout与setInterval实现多线程
2016/06/17 Javascript
jquery中用函数来设置css样式
2016/12/22 Javascript
Bootstrap实现可折叠分组侧边导航菜单
2018/03/07 Javascript
vuejs 制作背景淡入淡出切换动画的实例
2018/09/01 Javascript
vue+element-ui+axios实现图片上传
2019/08/20 Javascript
详解从vue-loader源码分析CSS Scoped的实现
2019/09/23 Javascript
JavaScript的console命令使用实例
2019/12/03 Javascript
python之wxPython应用实例
2014/09/28 Python
浅谈python 里面的单下划线与双下划线的区别
2017/12/01 Python
Python生成8位随机字符串的方法分析
2017/12/05 Python
Django+JS 实现点击头像即可更改头像的方法示例
2018/12/26 Python
Python 把序列转换为元组的函数tuple方法
2019/06/27 Python
python实现图片九宫格分割
2021/03/07 Python
浅谈对pytroch中torch.autograd.backward的思考
2019/12/27 Python
Keras实现将两个模型连接到一起
2020/05/23 Python
Pytorch实验常用代码段汇总
2020/11/19 Python
Python脚本调试工具安装过程
2021/01/11 Python
如果NULL定义成#define NULL((char *)0)难道不就可以向函数传入不加转换的NULL了吗
2012/02/15 面试题
校企合作协议书
2014/04/16 职场文书
政府班子四风问题整改措施思想汇报
2014/10/08 职场文书
学生逃课检讨书
2015/02/17 职场文书
证券公司客户经理岗位职责
2015/04/09 职场文书
毕业论文指导老师意见
2015/06/04 职场文书
城南旧事读书笔记
2015/06/29 职场文书
2015年秋季开学典礼校长致辞
2015/07/16 职场文书
小学语文的各类谚语(70首)
2019/08/15 职场文书
nginx.conf配置文件结构小结
2022/04/08 Servers