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 struct.unpack
Sep 06 Python
简单介绍Python中的decode()方法的使用
May 18 Python
深入理解Python中字典的键的使用
Aug 19 Python
python版本坑:md5例子(python2与python3中md5区别)
Jun 20 Python
pyhton列表转换为数组的实例
Apr 04 Python
对numpy中的transpose和swapaxes函数详解
Aug 02 Python
Python3爬取英雄联盟英雄皮肤大图实例代码
Nov 14 Python
Python3爬虫使用Fidder实现APP爬取示例
Nov 27 Python
如何在Python中实现goto语句的方法
May 18 Python
浅析Django 接收所有文件,前端展示文件(包括视频,文件,图片)ajax请求
Mar 09 Python
python3通过udp实现组播数据的发送和接收操作
May 05 Python
opencv 图像腐蚀和图像膨胀的实现
Jul 07 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采集利器 Snoopy 试用心得
2011/07/03 PHP
PHPMYADMIN导入数据最大为2M的解决方法
2012/04/23 PHP
php实现数组按指定KEY排序的方法
2015/03/30 PHP
ThinkPHP进程计数类Process用法实例详解
2015/09/25 PHP
PHP实现的浏览器检查类
2016/04/11 PHP
动态调用css文件——jquery的应用
2007/02/20 Javascript
Prototype源码浅析 Number部分
2012/01/16 Javascript
Fixie.js 自动填充内容的插件
2012/06/28 Javascript
jQuery 1.8 Release版本发布了
2012/08/14 Javascript
js使用数组判断提交数据是否存在相同数据
2013/11/27 Javascript
用js一次改变多个input的readonly属性值的方法
2014/06/11 Javascript
Node.js入门教程:在windows和Linux上安装配置Node.js图文教程
2014/08/14 Javascript
jQuery formValidator表单验证
2016/01/07 Javascript
javascript DIV实现跟随鼠标移动
2020/03/19 Javascript
全面了解构造函数继承关键apply call
2016/07/26 Javascript
JS实现页面跳转参数不丢失的方法
2016/11/28 Javascript
深入理解Vue.js源码之事件机制
2017/09/27 Javascript
深入理解React高阶组件
2017/09/28 Javascript
在knockoutjs 上自己实现的flux(实例讲解)
2017/12/18 Javascript
原生js拖拽实现图形伸缩效果
2020/02/10 Javascript
使用Python标准库中的wave模块绘制乐谱的简单教程
2015/03/30 Python
浅谈使用Python变量时要避免的3个错误
2017/10/30 Python
Tensorflow环境搭建的方法步骤
2018/02/07 Python
python ddt实现数据驱动
2018/03/14 Python
Python实现对文件进行单词划分并去重排序操作示例
2018/07/10 Python
python+ffmpeg批量去视频开头的方法
2019/01/09 Python
Python 判断图像是否读取成功的方法
2019/01/26 Python
python如何制作缩略图
2019/04/30 Python
python控制台实现tab补全和清屏的例子
2019/08/20 Python
Django文件上传与下载(FileFlid)
2019/10/06 Python
Django User 模块之 AbstractUser 扩展详解
2020/03/11 Python
Windows和Linux动态库应用异同
2016/04/17 面试题
十佳教师事迹材料
2014/01/11 职场文书
2014年个人工作总结模板
2014/12/15 职场文书
银行反洗钱宣传活动总结
2015/05/08 职场文书
动漫APP软件排行榜前十名,半次元上榜,第一款由腾讯公司推出
2022/03/18 杂记