• 对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")

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

  • 相关阅读:
    数据表后缀问题
    window.history.go(-1)返回且刷新页面
    mysql性能优化-慢查询分析、优化索引和配置
    从数据库、代码和服务器对PHP网站Mysql做性能优化
    什么是WEBserver? 经常使用的WEBserver有哪些?
    浅谈 C/S 和 B/S 架构
    Android常用开源项目
    csdn android视频播放器开发
    视频会议十大开源项目排行
    Android开源项目大全
  • 原文地址:https://www.cnblogs.com/zihao1037/p/11022347.html
Copyright © 2020-2023  润新知