对queryset的理解

Posted shangping

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了对queryset的理解相关的知识,希望对你有一定的参考价值。

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的理解的主要内容,如果未能解决你的问题,请参考以下文章

按模型的属性(不是字段)对 Django QuerySet 进行排序

在 Django 查询中提供 LIMIT 参数而不获取 QuerySet 的一部分

金蝶handler中 collection 代码片段理解

调用模板化成员函数:帮助我理解另一个 *** 帖子中的代码片段

精心收集的 48 个 JavaScript 代码片段,仅需 30 秒就可理解

理解 DocumentFragment