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