Django之ORM优化查询的方式
2024-09-04 16:58:06
ORM优化查询的方式
一、假设有三张表
Room
id
1
2
..
1000 User:
id
1
..
10000 Booking:
user_id room_id time_id date
1 1 8:00 2017-11-11
1 2 8:00 2017-11-11
1 3 8:00 2017-11-11
1 4 8:00 2017-11-11
1 5 8:00 2017-11-11
二、 需求:获取2018-11-11所有预定信息:
打印:用户名称,会议室名称, 预定时间段
# 解决方案一:执行11次sql语句
bk = models.Booking.objects.filter(date=2018-11-11)
for item in bk:
print(item.time_id, item.room.caption, item.user.user) # 解决方案二:执行1次
#select * from ... left join user ... join room
bk = models.Booking.objects.filter(date=2018-11-11).select_related('user','room')
for item in bk:
print(item.time_id, item.room.caption, item.user.user) # 解决方案三:执行3次
#select * from booking where date=2018-11-11
#select * from user where id in [1,]
#select * from room where id in [1,2,3,4,5]
bk = models.Booking.objects.filter(date=2018-11-11).prefetch_related('user','room')
for item in bk:
print(item.time_id, item.room.caption, item.user.user)
总结:以后对于SQL语句的优化要加上selsect_releated或者prefetch_releated,这只是对于跨表做的优化,如果是单表的话就没有必要进行优化查询了
那么什么时候用selsect_releated,什么时候用prefetch_releated呢?这个按情况而定,
selsect_releated是主动连表,执行一次SQL
prefetch_releated不连表执行3次SQL
1. [{} ]
all_users = models.User.objects.all().values('name','age','role__name') 2. [ 对象 ]
all_users = models.User.objects.all()
用的时候注意,只拿自己表中的字段,别跨表
3. select_related (外键、一对一)
all_users = models.User.objects.all().select_related('role') 4. prefetch_related (role)
all_users = models.User.objects.all().prefetch_related('role') 5. only
all_users = models.User.objects.all().only('name')
用的时候注意,只拿自己指定的字段
6. defer
all_users = models.User.objects.all().defer('name')
二、Q查询的第二种方式
remove_booking = Q()
for room_id, time_id_list in booking_info['del'].items():
for time_id in time_id_list:
temp = Q() #实例化一个Q对象
temp.connector = 'AND' #以and的方式连接
# user_id是一个字段,后面的是一个字段对应的值
temp.children.append(('user_id', request.session['user_info']['id'],))
temp.children.append(('booking_date', booking_date,))
temp.children.append(('room_id', room_id,))
temp.children.append(('booking_time', time_id,))
remove_booking.add(temp, 'OR') #以or的方式添加到temp
最新文章
- C#/VB.NET 获取电脑属性(硬盘ID、硬盘容量、Cpu序列号、MAC地址、系统类型)
- Cordova应用程序修改启动画面或者Icon
- C++设计模式-State状态模式
- Struts2拦截器初涉
- php-fpm.conf两个至关重要的参数
- SQLite简易入门
- JS实现项目查找功能
- CENTOS6上禁用IPV6和DHCP
- android中正确保存view的状态
- 小项目:聊天室 (jQuery,PHP,MySQL)
- Spring MVC执行的流程
- jquery easyui combobox 高度自适应
- 数据结构 - 表插入排序 具体解释 及 代码(C++)
- 团队-Forward团队-团队一阶段互评
- vs2017 编译vue 错误	TS2307	Build:找不到模块“webpack”。
- 设计模式之观察者模式(Observer)
- 谈谈你对MVC的理解
- [ovs][dpdk] ovs-dpdk, dpdk port 大量丢包
- EasyUI 列表展示及基本格式
- UVa 1639 Candy (数学期望+组合数学+高精度存储)
热门文章
- iOS数据持久化存储之归档NSKeyedArchiver
- html5--1.9 img元素嵌入图片
- 华为机试题 N阶楼梯的走法,每次走一步或者两步
- C语言中的指针(二)
- HihoCoder1651 : 小球染色([Offer收割]编程练习赛38)(DP的优化)
- MySQL_杭州拱墅区、西湖区近9-11月销售过的产品_20161125
- 【Lintcode】153.Combination Sum II
- javacpp-FFmpeg系列补充:FFmpeg解决avformat_find_stream_info检索时间过长问题
- Android HAL层与Linux Kernel层驱动开发简介
- check_MK安装部署(nagios4版本)