热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

django中QuerySet特性,支持切片,索引,可迭代(缓存机制)iterator性能优化

Book表的数据显示idtitlepricepublish_id2Linux3013项塔兰4524

Book表的数据显示

id title   price publish_id 2    Linux      30       1
3    项塔兰      45       2
4    追风筝的人    39.9      3
5    富爸爸      23        10

创建queryset 视图 函数,  可以使用的列表的方法,按索引,切片的方法取值,得到一个列表对象

def queryset(request): ret1 = Book.objects.all()[0]  #QuerySet支持索引,切片操作
    # print(ret1) #linux 得到一个具体的对象
    ret2 = Book.objects.all()[1:3] # print(ret2)#, ]>
    # ret3 = Book.objects.all()[:2]
    ret4 = Book.objects.all()[::2]# 按步长取,隔一个取一个,,,[::1}挨着取,一个个都取
    # print(ret3)#, ]>

    print(ret4)#[, ]

 

-----

可迭代特性,  iterator() ,exists()

主要是QuerySet的缓存机制,如果一次从数据库取出很多数据,就有可能导致程序崩溃,可以利用iterator()方法,做性能优化,

为了判断获取到的对象是否有值,没有必要遍历所有的对象,用exists()方法()

#可迭代特性
 book_list = Book.objects.all()  #取出数据库的所有对象,要考虑cache机制,如果数据量太大,程序就会崩溃
#判断book_list 是否有值,假如有很多数据,就没有必要全部查一遍才得知有数据,只要查到有1条数据,就可以知道book_list有数据,就exists()方法

  if book_list.exists():
  print('ok') #ok ,说明数据库有值
 #利用itertor()方法 book_list1 = Book.objects.all().iterator() #这次就不能用2次for循环,第一次for循环,就已经把遍历完了,
  
book_list1 = Book.objects.all().iterator()  #这次就不能用2for循环,第一次for循环,就已经把遍历完了,用next()方法每次取出一个值,
print(next(book_list1)) #linux
print(next(book_list1))#项塔兰
print(next(book_list1))#追风筝的人

Book.objects.filter(id=2).update(price=100.00)#对数据库数据进行更新,但并没有执行,只有在用到的时候在执行 for obj in book_list: # 在for循环时开始执行sql语句查询 print(obj.title,obj.price) #如果for循环2次,打印2次结果,也是执行一次sql语句,因为存在sql的缓存机制,把第一次查询的结果放到缓存里, #下次从缓存里调 """ Linux 30.00 ---没有更新数据之前 项塔兰 45.00 追风筝的人 39.90 富爸爸 23.00 """ """ Linux 100.00 ----更新数据之后 项塔兰 45.00 追风筝的人 39.90 富爸爸 23.00 """

 


推荐阅读
author-avatar
手机用户2502856573
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有