zoukankan      html  css  js  c++  java
  • 92.QuerySet API中的切片操作详细使用

    切片操作:

    使用情况分析:在我们的CSDN的个人主页会显示我们个人发布的多篇文章(20篇),如果还想查看更多,就可以点击最下方的“查看更多”按钮,在这里对首页的文章的个数的限制就用到了切片操作,或者是将文章进行分页显示,都用到了这种切片的操作。
    切片的操作不能用在Manager对象上,可以用在QuerySet对象上,我们可以通过get_queryset()方法返回一个QuerySet对象,同样也可以通过all()方法来获取一个QuerySet对象,因为在all方法的定义中就是调用了get_queryset()方法,返回QuerySet对象。之后就可以在QuerySet对象上使用切片操作。示例代码如下:
    def index12(request):
        # 切片操作,比如限制首页的文章的个数,就用到了切片操作
        # books = Book.objects[0:2]
        # 会返回一个错误信息:TypeError: 'Manager' object is not subscriptable
    
    	# get_queryset()方法获取一个QuerySet对象
        books = Book.objects.get_queryset()[0:2]
        # all()方法获取一个QuerySet对象
        books = Book.objects.all()[0:2]
        # 从1开始提取数据
        books = Book.objects.get_queryset()[1:2]
        for book in books:
            print(book)
        print(connection.queries)
        return HttpResponse('SUCCESS')
    

    使用get_queryset()方法时,django底层执行的sql语句如下所示:

    [{'sql': 'SELECT @@SQL_AUTO_IS_NULL', 'time': '0.000'}, 
    {'sql': 'SET SESSION TRANSACTION ISOLATION LEVEL READ COMMITTED', 'time': '0.000'}, 
    {'sql': 'SELECT `book`.`id`, `book`.`name`, `book`.`pages`, `book`.`price`, `book`.`rating`, `book`.`author_id`, `book`.`publisher_id`, `book`.`score` FROM `book` LIMIT 2', 'time': '0.000'}]
    # 从上面这条sql语句我们可以看出,LIMIT 2表示的限制返回的最多的数据量为2条数据信息
    

    使用get_queryset()方法获取从1:2的数据,django底层执行的sql语句如下所示:

    [{'sql': 'SELECT @@SQL_AUTO_IS_NULL', 'time': '0.000'}, 
    {'sql': 'SET SESSION TRANSACTION ISOLATION LEVEL READ COMMITTED', 'time': '0.000'}, 
    {'sql': 'SELECT `book`.`id`, `book`.`name`, `book`.`pages`, `book`.`price`, `book`.`rating`, `book`.`author_id`, `book`.`publisher_id`, `book`.`score` FROM `book` LIMIT 1 OFFSET 1', 'time': '0.000'}]
    # LIMIT 1 OFFSET :限制返回的数据为一条数据,并且设置了OFFSET 1,这代表的是从0开始向后偏移1个位置开始。
    

    执行all()方法获取0-2的数据,django底层执行的sql语句为:

    [{'sql': 'SELECT @@SQL_AUTO_IS_NULL', 'time': '0.000'}, 
    {'sql': 'SET SESSION TRANSACTION ISOLATION LEVEL READ COMMITTED', 'time': '0.000'}, 
    {'sql': 'SELECT `book`.`id`, `book`.`name`, `book`.`pages`, `book`.`price`, `book`.`rating`, `book`.`author_id`, `book`.`publisher_id`, `book`.`score` FROM `book` LIMIT 2', 'time': '0.000'}]
    
    

    总结:(1)切片操作:有时候只需要显示数据中的一部分,那么这个时候就会使用切片操作来完成,QuerySet使用切片操作与列表使用切片操作一样。

    (2)切片操作:并不是把所有的数据从数据库中提取出来在做操作,而是在数据库层面使用LIMINT和OFFSET来完成。在只需要使用一部分数据的时候,建议大家使用切片操作来完成。

    始于才华,忠于颜值;每件事情在成功之前,看起来都是天方夜谭。一无所有,就是无所不能。
  • 相关阅读:
    [转]data类型的Url格式:把小数据直接嵌入到Url中
    SQL 找出某列最小的行记录.
    用 Dos 像数据库一样拎出所有文件.
    Js 正则表达式 RegExp .
    KMP算法C语言实现。弄了好久才搞好。。。
    python如何保证输入键入数字
    数据库关系图:“此数据库没有有效所有者,因此无法安装数据库关系图支持对象"的解决方法
    建立sql数组的一个函数
    实用的240多个jQuery插件
    begin tran,commit tran和rollback tran的用法
  • 原文地址:https://www.cnblogs.com/guyan-2020/p/12272669.html
Copyright © 2011-2022 走看看