QuerySet的懒加载和链式调用

目录

一:问题引出

二:懒加载

三:链式调用


一:问题引出

posts = Post.objects.all ()  # Post是一个models模块的类
available_posts = posts.filter(status=l)

如果这条语句要立即执行,就会出现这种情况: 先执行Post.objects.all (),拿到所有的数据posts ,然后再执行过滤,拿到所有上线状态的文章available_posts ,这样就会产生两次数据库请求,并且两次查询存在重复的数据。当然,平时可能不会出现这么低级的错误,但是当代码比较复杂时,谁也无法保证不会出现类似的问题。

二:懒加载

Django 中的QuerySet 本质上是一个懒加载的对象,上面的两行代码执行后,都不会产生数据库查询操作,只是会返回一个QuerySet 对象,等你真正用它时才会执行查询。下面通过代码解释一下:

posts= Post.objects .all() # 返回一个QuerySet 对象并赋位给posts
available_posts = posts.filter(status=l) # 继续返回一个QuerySet 对象并赋位给available_posts
print(available_posts) # 此时会根据上面的两个条件执行数据查询操作,
# 对应的SQL 语句为SELECT * FROM blog_post where status =1;

三:链式调用

链式调用,这又是什么概念呢?

其实根据上面的代码,你应该能猜到了。链式调用就是,执行一个对象中的方法之后得到的结果还是这个对象,这样可以接着执行对象上的其他方法。比如下面这个代码:

posts = Post.ob]ects.filter(status=l).filter(category_id=2) filter(title=”Bruce” )

在每个函数(或者方法)的执行结果上可以继续调用同样的方法,因为每个函数的返回值都是它自己, 也就是QuerySet 。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值