zoukankan      html  css  js  c++  java
  • 对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")

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

  • 相关阅读:
    百度开发者中心BAE新建Java应用
    微信公众平台开发(三)位置信息的识别
    确定路名、标志性建筑和商场名的经度纬度
    Eclipse中Java Project转换为Java Web Project
    你应该知道的8个Java牛人
    周边信息查询
    在Java中避免空指针异常(Null Pointer Exception)
    google guava使用例子/示范(一)
    docker 相关链接
    HashMap 的数据结构
  • 原文地址:https://www.cnblogs.com/shangping/p/12494935.html
Copyright © 2011-2022 走看看