queryset的惰性和缓存

1. 惰性

  • 我们在构造 切片 过滤 传递queryset的时候是不会去数据库查询的,不会执行select语句
    简单点说就是
from user.models import User
下面这几行代码执行的时候不会执行SQL语句
queryset = User.objects.all()  
queryset = User.objects.all()[:2]
queryset = queryset.filter(is_delete=False)
  • 那么什么时候会执行呢?
    • 1 迭代 for i in queryset
    • 2 打印 print(queryset)
    • 3 list() list(queryset)
    • 4 当做条件判断 if queryset
    • 5 len() len(queryset)
    • 6 索引 即 user = queryset[0]
    • 7 带有步长的切片 queryset[::2]
    • 8 序列化缓存 将数据保存到redis中或者内存中的时候

2. 缓存

  • 当我们查询后,会将结果缓存在queryset对象中,如果我们下次访问这个queryset对象,那么我们访问的是缓存的数据
  • 简单来说就是
[ i for i in queryset]
#上面这句代码会将查询结果缓存在queryset中,如果我们在这时修改数据库,然后在执行上面
#这句代码,出现的结果则是修改之前的数据,因为我们已经将没有修改之前的缓存在qeruyset
  • 那么什么时候会不缓存呢?
    • 1 print()的时候, 我们每次print的时候都会重新去数据库查询,而不缓存
    • 2 user = queryset[1] 我们每次执行这个的时候都会去数据库查询,但是会把结果缓存给user这个变量,这就是我们使用user和使用queryset[1]有可能得到的结果是不一样的原因.
意思就是,不是所有的查询都会缓存queryset,我们要利用好缓存和惰性,来提高我们代码的性能,节省响应的时间.必须去数据库查询就尽量让他缓存,除非需要实时获取.不用去数据库查询,就让他尽量保持惰性状态.
发布了29 篇原创文章 · 获赞 3 · 访问量 4694

猜你喜欢

转载自blog.csdn.net/weixin_44898301/article/details/99713403