queryset的惰性和缓存

1. 惰性

  • 我们在构造、切片、传递queryset的时候不会访问数据库
# 简单点说就是,下面这几行代码执行的时候不会访问数据库并执行SQL语句
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]) # 这句代码会将查询结果缓存在queryset中
print([p.pub_date for p in queryset]) # 这句代码不会访问数据库,而是使用queryset缓存数据
  • 以下两种情况,queryset并不会缓存,但是需要注意的是若queryset被其它方式计算后,那么再打印或索引则使用的是queryset的缓存数据。
    • 打印:print(queryset)
    • 索引:queryset[1]

3、总结:

  • queryset有惰性,只有当被“计算”时才会访问数据库
  • 大部分“计算”查询会缓存queryset
  • 利用好缓存和惰性,来提高我们代码的性能,节省响应的时间
  • 不需要获取具体数据时,就让queryset尽量保持惰性状态
  • 使用相同数据时,尽量使用缓存的数据
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值