1. 惰性
我们在构造、切片、传递queryset的时候不会访问数据库
queryset = User. objects. all ( )
queryset = User. objects. all ( ) [ : 2 ]
queryset = queryset. filter ( is_delete= False )
只有当queryset对象被计算时,才会访问数据库,例如:
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被“计算”后,Django 就会将查询结果保存在queryset的缓存中,如果我们下次访问这个queryset对象,那么我们访问的是缓存的数据
queryset = Entry. objects. all ( )
print ( [ p. headline for p in queryset] )
print ( [ p. pub_date for p in queryset] )
以下两种情况,queryset并不会缓存,但是需要注意的是若queryset被其它方式计算后,那么再打印或索引则使用的是queryset的缓存数据。
打印:print(queryset)
索引:queryset[1]
3、总结:
queryset有惰性,只有当被“计算”时才会访问数据库 大部分“计算”查询会缓存queryset 利用好缓存和惰性,来提高我们代码的性能,节省响应的时间 不需要获取具体数据时,就让queryset尽量保持惰性状态 使用相同数据时,尽量使用缓存的数据