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,我们要利用好缓存和惰性,来提高我们代码的性能,节省响应的时间.必须去数据库查询就尽量让他缓存,除非需要实时获取.不用去数据库查询,就让他尽量保持惰性状态.