Python学习---django惰性机制

Django惰性机制 html

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

惰性机制之可迭代数据库

# 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缓存问题htm

    Django有本身的缓存,若是2次的obj对象一致,第二次的查值直接从缓存中取值。 对象

    若是期间数据库的内容做了更改,则须要从新查值。不然容易产生脏数据。 ip

    能够直接利用第一次的obj对象直接进行update操做,这样下次for循环查询时又从新执行了数据库查询操做,此时缓存也做了更改; 也能够从新手动查询一下结果,可是不推荐这样,由于咱们并不知道数据何时会进行修改,妥善的仍是Django用数据时本身去查询数据结果内存

注意1: 若是2次操做之间有数据进行了修改 ,则须要从新从数据库中查值,不然Django会从缓存中取出数据,影响最后的查询结果。get

# 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对象,因此从缓存中取值

正确操做it

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

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

注意2:

if objs():        查询数据库,而且将查询的全部数据结果放入数据库内
if objs.exist():  仅仅查询数据库,可是不会把全部的数据放入数据库内,
if obj.iterator():数据放入迭代器内,用一次迭代一次取一次便可
相关文章
相关标签/搜索