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():数据放入迭代器内,用一次迭代一次取一次即可

Django orm的惰性机制的更多相关文章

  1. Django中orm的惰性机制

    那么首先要知道什么是ORM 专业化的角度来说:叫对象关系映射(Object-Relation Mapping)是一种为了解决面向对象与关系数据库存在的互不匹配的现象的技术. 那具体ORM是什么呢?:( ...

  2. Django中的orm的惰性机制

    惰性机制:Publisher.objects.all()或者.filter()等都只是返回了一个QuerySet(查询结果集对象)[https://www.cnblogs.com/chaojiying ...

  3. diango中orm的惰性机制

    那么首先要知道什么是ORM 专业化的角度来说:叫对象关系映射(Object-Relation Mapping)是一种为了解决面向对象与关系数据库存在的互不匹配的现象的技术. 那具体ORM是什么呢?:( ...

  4. Python学习---django惰性机制

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

  5. Django 惰性机制

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

  6. django -orm操作总结

    前言 Django框架功能齐全自带数据库操作功能,本文主要介绍Django的ORM框架 到目前为止,当我们的程序涉及到数据库相关操作时,我们一般都会这么搞: 创建数据库,设计表结构和字段 使用 MyS ...

  7. py文件单独调试django ORM的配置

    1.新建一个py文件 2.代码环境搭建 import os if __name__ != '__main__': exit() # 加载django项目的配置信息 os.environ.setdefa ...

  8. Django 源码小剖: Django ORM 查询管理器

    ORM 查询管理器 对于 ORM 定义: 对象关系映射, Object Relational Mapping, ORM, 是一种程序设计技术,用于实现面向对象编程语言里不同类型系统的数据之间的转换.从 ...

  9. Django ORM 查询管理器

    Django ORM 查询管理器 ORM 查询管理器 对于 ORM 定义: 对象关系映射, Object Relational Mapping, ORM, 是一种程序设计技术,用于实现面向对象编程语言 ...

随机推荐

  1. JSM 基础

    JMS即Java消息服务(Java Message Service)应用程序接口,是一个Java平台中关于面向消息中间件(MOM)的API,用于在两个应用程序之间,或分布式系统中发送消息,进行异步通信 ...

  2. 日志服务Python消费组实战(二):实时分发数据

    场景目标 使用日志服务的Web-tracking.logtail(文件极简).syslog等收集上来的日志经常存在各种各样的格式,我们需要针对特定的日志(例如topic)进行一定的分发到特定的logs ...

  3. iOS之CAShapeLayer属性简介

    1.CAShapeLayer需要和贝塞尔曲线一块使用! #import <QuartzCore/CALayer.h> NS_ASSUME_NONNULL_BEGIN CA_CLASS_AV ...

  4. dns 逐级查找顺序

    1.浏览器 dns 缓存 2.Windows Host 文本 3.windows 本地 dns 缓存 方法/步骤 首先我们来查看win系统内保存的dns缓存并进行清空dns缓存操作. ... 点击确定 ...

  5. 04_jQuery对象初识(三)

    <div id="d1"> <p><span>span</span></p> <div>div</di ...

  6. wpf布局控件总结

    首先要认识到wpf所有的布局控件都继承自Panel类,Panel类又继承自其他类.继承关系如下: 一.StackPanel布局面板 1.该面板在单行或者单列中以堆栈的形式放置其子元素. 默认情况下,S ...

  7. myeclipse中tomcat内存大小的设置

    刚刚安装了myeclipse9.0,又配置了tomcat7.0,想用ssh框架搭个项目试试tomcat7.0,没想到刚启动项目就会报错,在tomcat6.0中就不会有问题,上网查了那些都不起作用,后来 ...

  8. PKU 百练OJ Arbitrage

    http://bailian.openjudge.cn/practice/2240/ #include <iostream> #include <string> #includ ...

  9. [转]C#中用NamedPipe进程间通信

    转自:http://blog.csdn.net/jinjazz/archive/2009/02/03/3861143.aspx 本文只是一个测试例子,核心代码是kernel32.dll中的一组wind ...

  10. putty开源的ssh软件工具

    # 登录远程服务器需要ip和端口即可:还是开源工具用起来无忧无虑.无拘无束,这种感觉实在太舒服了,比起xshell开始免费.后来收费好太多太多,不用担心哪天过期了,想干嘛就干嘛. 软件下载地址:htt ...