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使用rabbitmq实现网络爬虫示例
Feb 20 Python
在IIS服务器上以CGI方式运行Python脚本的教程
Apr 25 Python
详解Python文本操作相关模块
Jun 22 Python
Python中使用haystack实现django全文检索搜索引擎功能
Aug 26 Python
Python基于identicon库创建类似Github上用的头像功能
Sep 25 Python
Python爬取附近餐馆信息代码示例
Dec 09 Python
Python 实现两个列表里元素对应相乘的方法
Nov 14 Python
Django 开发调试工具 Django-debug-toolbar使用详解
Jul 23 Python
tensorflow之并行读入数据详解
Feb 05 Python
使用Python将Exception异常错误堆栈信息写入日志文件
Apr 08 Python
Python - 10行代码集2000张美女图
May 23 Python
Python基础学习之奇异的GUI对话框
May 27 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中spl_autoload详解
2014/10/17 PHP
PHP简单实现断点续传下载的方法
2015/09/25 PHP
php实现的XML操作(读取)封装类完整实例
2017/02/23 PHP
PHP实现的装箱算法示例
2018/06/23 PHP
ExtJS TabPanel beforeremove beforeclose使用说明
2010/03/31 Javascript
ExtJs的Date格式字符代码
2010/12/30 Javascript
Js base64 加密解密介绍
2013/10/11 Javascript
jquery设置按钮停顿3秒不可用
2014/03/07 Javascript
text-align:justify实现文本两端对齐 兼容IE
2015/08/19 Javascript
jQuery 中的 DOM 操作
2016/04/26 Javascript
使用React实现轮播效果组件示例代码
2016/09/05 Javascript
纯JS打造网页中checkbox和radio的美化效果
2016/10/13 Javascript
详解在Vue中通过自定义指令获取dom元素
2017/03/04 Javascript
Node.js实现发送邮件功能
2017/11/06 Javascript
webpack@v4升级踩坑(小结)
2018/10/08 Javascript
JavaScript设计模式之装饰者模式实例详解
2019/01/17 Javascript
JavaScript数组去重的方法总结【12种方法,号称史上最全】
2019/02/28 Javascript
[03:20]2015国际邀请赛全明星表演赛
2015/08/08 DOTA
[01:38]完美世界DOTA2联赛(PWL)宣传片:第一站
2020/10/26 DOTA
Python开发的单词频率统计工具wordsworth使用方法
2014/06/25 Python
简单介绍利用TK在Python下进行GUI编程的教程
2015/04/13 Python
python使用nntp读取新闻组内容的方法
2015/05/08 Python
详解python的webrtc库实现语音端点检测
2017/05/31 Python
python之virtualenv的简单使用方法(必看篇)
2017/11/25 Python
解决Python运行文件出现out of memory框的问题
2018/12/03 Python
Python彻底删除文件夹及其子文件方式
2019/12/23 Python
Keras搭建自编码器操作
2020/07/03 Python
python 爬虫网页登陆的简单实现
2020/11/30 Python
伦敦时尚生活的缩影:LN-CC
2017/01/24 全球购物
英国第一豪华护肤品牌:Elemis
2017/10/12 全球购物
标记环网Toke Ring IEEE802.5
2014/05/26 面试题
中班开学寄语
2014/04/04 职场文书
2014中考励志标语
2014/06/05 职场文书
国家助学金感谢信
2015/01/21 职场文书
支行行长岗位职责
2015/02/15 职场文书
创业计划书之家教中心
2019/09/25 职场文书