Django惰性机制

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

惰性机制之可迭代

1
2
3
# objs=models.Book.objects.all() # [obj1,obj2,ob3...]
# for obj in objs: # 每一obj就是一个行对象,此时会执行sql
#     print("obj:",obj)

惰性机制之可切片

1
2
3
4
# 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会从缓存中取出数据,影响最后的查询结果。

1
2
3
4
5
6
7
8
9
# 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:

1
2
3
if objs():        查询数据库,并且将查询的所有数据结果放入数据库内
if objs.exist():  仅仅查询数据库,但是不会把所有的数据放入数据库内,
if obj.iterator():数据放入迭代器内,用一次迭代一次取一次即可

最新文章

  1. webpack常用配置总结
  2. reset 单个文件 回退
  3. Swift3.0语言教程删除字符与处理字符编码
  4. rman恢复误删除的一张表(不完全恢复)
  5. iOS之UI--辉光动画
  6. Linux 网络编程二(Socket创建)
  7. JavaScript事件大全3
  8. 单源最短路径——Dijkstra算法学习
  9. git 和 svn的区别(转)
  10. ORA-02095: specified initialization parameter cannot be modified
  11. 字符串对比.net String.EndsWith方法 (String)
  12. ios 初体验<页面切换>
  13. Python 数据分析Windows环境搭建
  14. python3集合练习(set)
  15. CentOS7安装OpenLDAP+MySQL+PHPLDAPadmin
  16. Vue、Vuex+Cookie 实现自动登陆 。
  17. [转]csv文件导入Mysql
  18. CURLcode的定义
  19. Mac下 如何配置虚拟机软件Parallel Desktop--超详细
  20. (转)DSound开发常用的几个结构

热门文章

  1. ArcMap10.2 中制作符号库
  2. 深入浅出 Java Concurrency (28): 线程池 part 1 简介[转]
  3. Python学习之while练习--九九乘法表
  4. NYOJ--311(完全背包)
  5. Linux文件句柄数配置
  6. 使用flags定义命令行参数
  7. Spring Cloud各组件
  8. 从NoSQL到NewSQL数据库
  9. 跟我一起学koa之在koa中使用mongoose(四)
  10. CentOS 6.5 源码编译搭建LAMP(两台独立主机实现)