Django惰性机制

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

惰性机制之可迭代

# objs=models.Book.objects.all() # [obj1,obj2,ob3...]

# for obj in objs: # 每一obj就是一个行对象,此时会执行sql

# print("obj:",obj)

惰性机制之可切片

# objs=models.Book.objects.all() # [obj1,obj2,ob3...]

# print(objs[1])

# print(objs[1:4])

# print(objs[::-1])

惰性机制之Django缓存问题

Django有自己的缓存,如果2次的obj对象一致,第二次的查值直接从缓存中取值。

如果期间数据库的内容作了更改,则需要重新查值。否则容易产生脏数据。

可以直接利用第一次的obj对象直接进行update操作,这样下次for循环查询时又重新执行了数据库查询操作,此时缓存也作了更改; 也可以重新手动查询一下结果,但是不推荐这样,因为我们并不知道数据什么时候会进行修改,妥善的还是Django用数据时自己去查询数据结果

注意1: 如果2次操作之间有数据进行了修改 ,则需要重新从数据库中查值,否则Django会从缓存中取出数据,影响最后的查询结果。

# objs=models.Book.objects.all() # [obj1,obj2,ob3...]

# for obj in objs: # 每一obj就是一个行对象,此时会执行sql

# print("obj:",obj)

Models.Bool.update.get(id=2).update('title'='YYY') # 数据库内更改,缓存未更改

# objs=models.Book.objects.all() 重新从数据库内查找并赋值给objs

# objs.update(title='YYY') 推荐使用,直接数据库/内存都更改了,下面for循环查询时重新执行了数据库

# objs=models.Book.objects.all() # [obj1,obj2,ob3...]

# for obj in objs:

# print("obj:",obj) # 还是objs对象,所以从缓存中取值

正确操作:

1. 重新执行查询 objs=models.Book.objects.all() 【不推荐】

2. 利用objs.update(title='YYY');  此时数据库已经更改,缓存内的值也做了更改

注意2:

if objs(): 查询数据库,并且将查询的所有数据结果放入数据库内

if objs.exist(): 仅仅查询数据库,但是不会把所有的数据放入数据库内,

if obj.iterator():数据放入迭代器内,用一次迭代一次取一次即可

python 惰性_Python学习---django惰性机制相关推荐

  1. 2019最新Python学习教程(Python视频教程_Python学习教程_Python学习路线):你心目中编程界的MVP是谁?

    2019最新Python学习教程(Python视频教程_Python学习教程_Python学习路线):你心目中编程界的MVP是谁?编程界的王者是渐落寞的Java还是大火的Python? 是不是你们也喜 ...

  2. python建立文件数据库_python学习-- Django根据现有数据库,自动生成models模型文件...

    Django引入外部数据库还是比较方便的,步骤如下 : 创建一个项目,修改seting文件,在setting里面设置你要连接的数据库类型和连接名称,地址之类,和创建新项目的时候一致 运行下面代码可以自 ...

  3. python 客户端 如何获取手机_Python学习---Django的request扩展[获取用户设备信息]

    关于Django的request扩展[获取用户设备信息] settings.py INSTALLED_APPS = [ ... 'app01', # 注册app ] STATICFILES_DIRS ...

  4. python大纲_python学习大纲

    知乎获赞无数的编程指南,介绍的不光是一门语言的入门,也是关于编程的入门,谈到了作为一名程序员,应该掌握的一些计算机知识. ------ 二.Python社区 强烈推荐Python Tip,有刷题挑战赛 ...

  5. python 月报_Python学习经验分享

    在18年初工作上遇到瓶颈,我选择了在数据分析这条路上深入.当时工作内容主要是在经营部出各种日报.月报及数据,这个时候我有俩个选择:一.选择经营管理方向发展,二.数据分析方向,三.其他方向.在经营管理方 ...

  6. python不简单_Python学习并不简单!月薪过万也不易

    Python入门简单,精通不易 可以说,大部分编程语言都是入门简单,精通不易. 了解编程语言的基本语法很快,使用编程语言开发符合企业标准的项目很难.要想达到企业用人标准,需要花费非常多的时间去学习编程 ...

  7. Python源码学习:多线程实现机制

    Python源码分析 本文环境python2.5系列 参考书籍<<Python源码剖析>> 本文分析Python中的多线程机制,主要通过一个多线程的脚本来分析多线程的基本操作与 ...

  8. 菜鸟学python 哪吒_Python 学习之路 (前言)

    为什么要学Python 1,脚本语言本身很方便简洁,未来会有趋势 2,web 方向 3,运维方向 我是学静态语言出身的,java,毕业后从事android 应用开发,曾在工作期间学习过linux,想从 ...

  9. python勾股定理_Python学习第128课——在Python中实现醉汉随机游走

    [每天几分钟,从零入门python编程的世界!] 这节我们在2D平面内实现随机游走.我们先把原理搞清楚,用代码实现这个原理. 原理分析: 我们想像在2D平面内有一个x轴和y轴组成的坐标系,有一个人他是 ...

最新文章

  1. jupyter notebook报错:ImportError: cannot import name ‘Imputer‘ from ‘sklearn.preprocessing‘解决方法
  2. reactjs回调函数形式的ref:含内联形式回调函数调用次数问题
  3. IDEA Terminal命令行运行javac时,一个类运用另一个类的方法找不到符号的问题
  4. 下列关于linux的进程,描述不正确的是,进程是资源管理的最小单位,2012年7月成人自考网络操作系统考试真题...
  5. PHP (20140505)
  6. 工作区、暂存区、版本库、远程仓库
  7. dell服务器r730安装esxi系统,安装Esxi系统重装Esxi系统
  8. 二、Linux系统目录和文件基本操作
  9. 一点一点看JDK源码(二)java.util.List
  10. 关于空间分析的一点小思考
  11. sql优化常用的几种方法
  12. WPF 入门教程打印控件
  13. python图片处理教程_Python图像入门教程:Python图像入门教程推荐
  14. 剪辑视频,垂直翻转如何实现
  15. Mac 自动代理切换
  16. 集成redis,删除key报“srem“异常
  17. Imperva WAF Bypass【翻译】
  18. CLion配置STM32开发环境(JLink GDB Server)
  19. tplink720n变无线打印服务器,TL-WR720N路由器无线路由模式设置
  20. 调用U9系统里的新增杂收服务服务

热门文章

  1. @Configuration
  2. 017_SpringBoot异常处理方式-自定义错误页面
  3. CAD2019软件安装教程
  4. Keil uVision5中配置stm32标准固件库v3.5
  5. nvidia显卡cuda的性能_性能追平上代万元旗舰!NVIDIA GeForce RTX 3070规格解析
  6. 链表list(链式存储结构实现)_数据结构知否知否系列之 — 线性表的顺序与链式存储篇(8000 多字长文)...
  7. php3d按钮,CSS实现3D按钮效果
  8. linux双屏显示不同内容,LINUX下双屏显示问题
  9. ubuntu使用fail2ban_如何在Ubuntu 20.04上安装和配置Fail2ban
  10. [PVLDB 12] GraphLab : 分布式机器学习大规模图处理系统 学习总结