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

最新文章

  1. C#/VB.NET 获取电脑属性(硬盘ID、硬盘容量、Cpu序列号、MAC地址、系统类型)
  2. Cordova应用程序修改启动画面或者Icon
  3. C++设计模式-State状态模式
  4. Struts2拦截器初涉
  5. php-fpm.conf两个至关重要的参数
  6. SQLite简易入门
  7. JS实现项目查找功能
  8. CENTOS6上禁用IPV6和DHCP
  9. android中正确保存view的状态
  10. 小项目:聊天室 (jQuery,PHP,MySQL)
  11. Spring MVC执行的流程
  12. jquery easyui combobox 高度自适应
  13. 数据结构 - 表插入排序 具体解释 及 代码(C++)
  14. 团队-Forward团队-团队一阶段互评
  15. vs2017 编译vue 错误 TS2307 Build:找不到模块“webpack”。
  16. 设计模式之观察者模式(Observer)
  17. 谈谈你对MVC的理解
  18. [ovs][dpdk] ovs-dpdk, dpdk port 大量丢包
  19. EasyUI 列表展示及基本格式
  20. UVa 1639 Candy (数学期望+组合数学+高精度存储)

热门文章

  1. iOS数据持久化存储之归档NSKeyedArchiver
  2. html5--1.9 img元素嵌入图片
  3. 华为机试题 N阶楼梯的走法,每次走一步或者两步
  4. C语言中的指针(二)
  5. HihoCoder1651 : 小球染色([Offer收割]编程练习赛38)(DP的优化)
  6. MySQL_杭州拱墅区、西湖区近9-11月销售过的产品_20161125
  7. 【Lintcode】153.Combination Sum II
  8. javacpp-FFmpeg系列补充:FFmpeg解决avformat_find_stream_info检索时间过长问题
  9. Android HAL层与Linux Kernel层驱动开发简介
  10. check_MK安装部署(nagios4版本)