欢迎访问 生活随笔!

生活随笔

当前位置: 首页 > 编程语言 > python >内容正文

python

python 惰性_Python学习---django惰性机制

发布时间:2025/4/16 python 45 豆豆
生活随笔 收集整理的这篇文章主要介绍了 python 惰性_Python学习---django惰性机制 小编觉得挺不错的,现在分享给大家,帮大家做个参考.

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惰性机制的全部内容,希望文章能够帮你解决所遇到的问题。

如果觉得生活随笔网站内容还不错,欢迎将生活随笔推荐给好友。