QuerySet存在的意义主要在惰性机制和缓存两点

---------->惰性机制:

所谓惰性机制:Publisher.objects.all()或者.filter()等都只是返回了一个QuerySet(查询结果集对象),它并不会马上执行sql,而是当调用QuerySet的时候才执行。

QuerySet特点:

<1>  可迭代的

<2>  可切片【做分页时经常用到】

    #objs=models.Book.objects.all()#[obj1,obj2,ob3...]#QuerySet:   可迭代# for obj in objs:#每一obj就是一个行对象#     print("obj:",obj)# QuerySet:  可切片# print(objs[1])# print(objs[1:4])# print(objs[::-1])
    #objs=models.Book.objects.all()#[obj1,obj2,ob3...]#QuerySet:   可迭代# for obj in objs:#每一obj就是一个行对象#     print("obj:",obj)# QuerySet:  可切片# print(objs[1])# print(objs[1:4])# print(objs[::-1])

QuerySet的高效使用:

  1.   惰性的
  2.   调用时执行sql【调用--》for循环,做if条件等使用此变量】,放入缓存
  3.   具有cache
  4.   if判断会执行整个queryset,并放入缓存
  5.   iterator()方法,禁止缓存,减少缓存的使用,但增加了数据库查询

<1>Django的queryset是惰性的

Django的queryset对应于数据库的若干记录(row),通过可选的查询来过滤。例如,下面的代码会得
到数据库中名字为‘Dave’的所有的人:person_set = Person.objects.filter(first_name="Dave")
上面的代码并没有运行任何的数据库查询。你可以使用person_set,给它加上一些过滤条件,或者将它传给某个函数,
这些操作都不会发送给数据库。这是对的,因为数据库查询是显著影响web应用性能的因素之一。

<2>要真正从数据库获得数据,你可以遍历queryset或者使用if queryset,总之你用到数据时就会执行sql.
为了验证这些,需要在settings里加入 LOGGING(验证方式)
obj=models.Book.objects.filter(id=3)
# for i in obj:
# print(i)

# if obj:
# print("ok")

<3>queryset是具有cache的
当你遍历queryset时,所有匹配的记录会从数据库获取,然后转换成Django的model。这被称为执行
(evaluation).这些model会保存在queryset内置的cache中,这样如果你再次遍历这个queryset,
你不需要重复运行通用的查询。
obj=models.Book.objects.filter(id=3)

# for i in obj:
# print(i)
## models.Book.objects.filter(id=3).update(title="GO")
## obj_new=models.Book.objects.filter(id=3)
# for i in obj:
# print(i) #LOGGING只会打印一次

<4>
简单的使用if语句进行判断也会完全执行整个queryset并且把数据放入cache,虽然你并不需要这些
数据!为了避免这个,可以用exists()方法来检查是否有数据:

obj = Book.objects.filter(id=4)
# exists()的检查可以避免数据放入queryset的cache。
if obj.exists():
print("hello world!")

<5>当queryset非常巨大时,cache会成为问题

处理成千上万的记录时,将它们一次装入内存是很浪费的。更糟糕的是,巨大的queryset可能会锁住系统
进程,让你的程序濒临崩溃。要避免在遍历数据的同时产生queryset cache,可以使用iterator()方法
来获取数据,处理完数据就将其丢弃。
objs = Book.objects.all().iterator()
# iterator()可以一次只从数据库获取少量数据,这样可以节省内存
for obj in objs:
print(obj.name)
#BUT,再次遍历没有打印,因为迭代器已经在上一次遍历(next)到最后一次了,没得遍历了
for obj in objs:
print(obj.name)

#当然,使用iterator()方法来防止生成cache,意味着遍历同一个queryset时会重复执行查询。所以使
#用iterator()的时候要当心,确保你的代码在操作一个大的queryset时没有重复执行查询

总结:
queryset的cache是用于减少程序对数据库的查询,在通常的使用下会保证只有在需要的时候才会查询数据库。
使用exists()和iterator()方法可以优化程序对内存的使用。不过,由于它们并不会生成queryset cache,可能
造成额外的数据库查询

<1>Django的queryset是惰性的Django的queryset对应于数据库的若干记录(row),通过可选的查询来过滤。例如,下面的代码会得到数据库中名字为‘Dave’的所有的人:person_set = Person.objects.filter(first_name="Dave")上面的代码并没有运行任何的数据库查询。你可以使用person_set,给它加上一些过滤条件,或者将它传给某个函数,这些操作都不会发送给数据库。这是对的,因为数据库查询是显著影响web应用性能的因素之一。<2>要真正从数据库获得数据,你可以遍历queryset或者使用if queryset,总之你用到数据时就会执行sql.为了验证这些,需要在settings里加入 LOGGING(验证方式)obj=models.Book.objects.filter(id=3)# for i in obj:#     print(i)# if obj:#     print("ok")<3>queryset是具有cache的当你遍历queryset时,所有匹配的记录会从数据库获取,然后转换成Django的model。这被称为执行(evaluation).这些model会保存在queryset内置的cache中,这样如果你再次遍历这个queryset,你不需要重复运行通用的查询。obj=models.Book.objects.filter(id=3)# for i in obj:#     print(i)## models.Book.objects.filter(id=3).update(title="GO")## obj_new=models.Book.objects.filter(id=3)# for i in obj:#     print(i)   #LOGGING只会打印一次<4>简单的使用if语句进行判断也会完全执行整个queryset并且把数据放入cache,虽然你并不需要这些数据!为了避免这个,可以用exists()方法来检查是否有数据:obj = Book.objects.filter(id=4)#  exists()的检查可以避免数据放入queryset的cache。if obj.exists():print("hello world!")<5>当queryset非常巨大时,cache会成为问题处理成千上万的记录时,将它们一次装入内存是很浪费的。更糟糕的是,巨大的queryset可能会锁住系统进程,让你的程序濒临崩溃。要避免在遍历数据的同时产生queryset cache,可以使用iterator()方法来获取数据,处理完数据就将其丢弃。objs = Book.objects.all().iterator()# iterator()可以一次只从数据库获取少量数据,这样可以节省内存for obj in objs:print(obj.name)#BUT,再次遍历没有打印,因为迭代器已经在上一次遍历(next)到最后一次了,没得遍历了for obj in objs:print(obj.name)#当然,使用iterator()方法来防止生成cache,意味着遍历同一个queryset时会重复执行查询。所以使#用iterator()的时候要当心,确保你的代码在操作一个大的queryset时没有重复执行查询总结:queryset的cache是用于减少程序对数据库的查询,在通常的使用下会保证只有在需要的时候才会查询数据库。
使用exists()和iterator()方法可以优化程序对内存的使用。不过,由于它们并不会生成queryset cache,可能
会造成额外的数据库查询。

转载于:https://www.cnblogs.com/rain-chenwei/p/9685486.html

Django OMR QuerySet的特性/存在意义相关推荐

  1. Django ORM QuerySet集合对象的特性

    ---------->惰性机制: 所谓惰性机制:Publisher.objects.all()或者.filter()等都只是返回了一个QuerySet(查询结果集对象),它并不会马上执行sql, ...

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

    Book表的数据显示 id title price publish_id 2 Linux 30 1 3 项塔兰 45 2 4 追风筝的人 39.9 3 5 富爸爸 23 10 创建queryset 视 ...

  3. django中queryset的两大特性

    roles = RoleInfo.objects.all() 一.查询集的惰性执行 创建查询集的时候,是不会访问数据库的,直到真正的调用数据的时候,才会访问数据库,所以 roles = RoleInf ...

  4. Pycharm开发Django项目QuerySet API

    QuerySet API: 我们通常做查询操作的时候,都是通过模型名字.objects的方式进行操作.其实模型名字.objects是一个django.db.models.manager.Manager ...

  5. html显示queryset,Django用queryset将对象从视图返回到HTML?

    我试图用HTML显示Django中查询集的一些信息.但我不知道最好的办法.在 我的想法是,当我打开网页,这显示了用户的名字和与之相关的比赛.用户可以在Django的管理中创建竞争.在 我的网址是.在u ...

  6. Django中QuerySet查询优化之prefetch_related详解

    在数据库有外键的时候,使用 select_related() 和 prefetch_related() 可以很好的减少数据库请求的次数,从而提高性能.本文通过一个简单的例子详解这两个函数的作用.虽然Q ...

  7. Django之QuerySet 查询

    首先来看下如何查询.我们在网页中增加书名的查询链接 后端的查询处理代码:这里由于authors是manytomanyfiled,因此我们这里用r.authors.all().first()来查询符合条 ...

  8. 图像的频谱特性物理意义:

    一个恰当的比喻是将傅里叶变换比作一个玻璃棱镜.棱镜是可以将光分解为不同颜色的物理仪器,每个成分的颜色由波长(或频率)来决定. 傅里叶变换可以看作是数学上的棱镜,将函数基于频率分解为不同的成分.当我们考 ...

  9. django(七)之数据库表的单表-增删改查QuerySet,双下划线

    https://www.cnblogs.com/haiyan123/p/7738435.html https://www.cnblogs.com/yuanchenqi/articles/6083427 ...

最新文章

  1. ASP.NET基础教程-DataTable类对象-属性方法和事件
  2. 线程中消费者生产者的实例代码(使用Lock类)
  3. Vue el-menu高亮设置及点击菜单项实现路由跳转
  4. laytpl : 一款非常轻量的JavaScript模板引擎
  5. plsql job执行多个存储过程_spring-boot-micro-job一款分布式任务调度执行框架
  6. 在传统行业做数字化转型之业务篇
  7. 关于非root用户配置ssh运行环境
  8. Introduction-To-Signal-Processingorfanidis-i2sp
  9. C++ 预处理器和名称空间
  10. error C2146: 语法错误 : 缺少“;”(在标识符“PVOID64”的前面)[转]
  11. 阮一峰:WebSocket 教程
  12. 综述---图像处理中的注意力机制
  13. python加权求和_python求加权平均值的实例(附纯python写法)
  14. DCDC电源负载瞬态响应分析
  15. 青岛大学的计算机专业考研分数线,青岛大学考研分数线
  16. 云剪贴板:以备不时之需
  17. Kubernetes Events介绍(中)
  18. 用PYTHON优化投资组合的配置
  19. 面朝大海——我的2016
  20. web前端30个项目列表,学完即可上手做项目

热门文章

  1. Java开发手册-MySQL数据库-ORM映射
  2. 学习springMVC时遇到的第一个异常:TemplateInputException
  3. STC单片机程序烧录你了解吗
  4. 蓝桥杯2021 第二期模拟赛
  5. 为什么iphone邮箱里已发送邮件是空的
  6. 有红白黑三种颜色的球用循环php,北师大版小学数学四年级上册综合复习题
  7. 老张的哲学-netcore基础
  8. Java获取时间戳方法比较
  9. jquery 点击事件切换样式
  10. 双十一什么移动电源值得买,值得买的移动电源推荐