码迷,mamicode.com
首页 > 其他好文 > 详细

对queryset的理解

时间:2020-03-14 23:46:58      阅读:58      评论:0      收藏:0      [点我收藏+]

标签:_id   query   方式   获取数据   category   存在   连接   其他   obj   

1. 如何通过Django的Model操作数据库?

在Django的Model中,QuerySet是一个很重要的概念。因为我们同数据库的所有查询以及更新交互都是通过它来完成的。

2. Django的Model是如何提供提数据的?

在model中,Django通过给Model增加一个objects属性来提供数据操作大的接口。比如:想要查询所有文章的数据,可以这么写:

1 Post.objects.all()

这样一来就能拿到QuerySet对象。这个对象中包括了我们需要的数据,当我们用到它时,他才会去数据库中获取数据。

3. 为什要这样?

原因:QuerySet支持链式调用。如果每次执行都要查询数据库的话,会存在性能问题。 举个例子:

1 post = Post.objects.all()
2 available_posts = Posts.filter(status=1)

如果这条语句要执行的话,先执行Post.objects.all(),拿到所有的数据posts,然后再执行过滤,拿到所有status=1的available_posts,这样就会产生两次数据库请求,并且两次查询存在重复的数据。

一般来说,平时写不出这样的语句,但是当代码比较复杂时,可能会出现这样的问题。

4. 对QuerySet的理解

因此,Django中的QuerySet本质上是一个懒加载的对象。以上的两行代码执行之后,都不会产生数据库查询操作,只是会返回一个QuerySet对象,等你真正用到它的时候才会执行查询。

代码解释:

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

4. 什么又是链式调用呢?

执行一个对象中的方法之后得到的结果还是这个对象,这样可以接着执行对象上面的其他方法,这就是链式调用。

举例:

1 posts = Post.objects.filter(status=1).filter(category_id=2).filter(title__icontains="xxx")

这是一种良好的编程方式,对数据处理更加自然。类似于管道与水流的关系,数据就是水流,而管道就是方法,把不同的管道连接起来形成“链”,然后让数据流过。

对queryset的理解

标签:_id   query   方式   获取数据   category   存在   连接   其他   obj   

原文地址:https://www.cnblogs.com/shangping/p/12494935.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!