zoukankan      html  css  js  c++  java
  • 85.常用的返回QuerySet对象的方法使用详解:defer,only

    defer(),only(): 这两个方法都会返回一个“QuerySet”对象,并且这个“QuerySet”中装的是模型,不像values()和values_list()是字典或元组。

    1. defer:这个方法用来告诉“ORM”, 在查询某个模型的时候,过滤掉某个字段,注意:使用“defer”的字段,如果以后在使用这个字段,会重新发起一次请求,因此要谨慎操作。

    示例代码如下:
    def index6(request):
        books = Book.objects.defer('name')
        for book in books:
            print("%s, %s" % (book.id, book.author))
        print(connection.queries)
        
        return HttpResponse("success")
    

    django底层执行的sql语句为:

     [{'sql': 'SELECT @@SQL_AUTO_IS_NULL', 'time': '0.000'},
     {'sql': 'SET SESSION TRANSACTION ISOLATION LEVEL READ COMMITTED', 'time': '0.000'},
    # 由下面的这条sql语句可以看出,在执行sql语句查找book的相关属性的时候,没有查找我们传递进defer()的属性字段name
     {'sql': 'SELECT `book`.`id`, `book`.`pages`, `book`.`price`, `book`.`rating`, `book`.`author_id`, `book`.`publisher_id`, `book`.`score` FROM `book`', 'time': '0.000'},
     {'sql': 'SELECT `author`.`id`, `author`.`name`, `author`.`age`, `author`.`email` FROM `author` WHERE `author`.`id` = 5 LIMIT 21', 'time': '0.000'},
     {'sql': 'SELECT `author`.`id`, `author`.`name`, `author`.`age`, `author`.`email` FROM `author` WHERE `author`.`id` = 1 LIMIT 21', 'time': '0.000'},
     {'sql': 'SELECT `author`.`id`, `author`.`name`, `author`.`age`, `author`.`email` FROM `author` WHERE `author`.`id` = 4 LIMIT 21', 'time': '0.000'},
     {'sql': 'SELECT `author`.`id`, `author`.`name`, `author`.`age`, `author`.`email` FROM `author` WHERE `author`.`id` = 3 LIMIT 21', 'time': '0.000'}]
    

    2. only: 这个方法用来告诉“ORM”,在查询某个模型的时候,只提取某个字段。注意:没有加在“only”中的字段会被过滤掉,并且以后使用的话,就会再次重新发起一次请求,因此这个操作要谨慎。

    示例代码如下:
    def index7(request):
        books = Book.objects.only('name')
        for book in books:
            print(book.name)
        print(connection.queries)
        return HttpResponse("Success")
    

    django底层执行的sql语句为:

    [{'sql': 'SELECT @@SQL_AUTO_IS_NULL', 'time': '0.000'},
    {'sql': 'SET SESSION TRANSACTION ISOLATION LEVEL READ COMMITTED', 'time': '0.000'},
    #  由下面这条查询语句可以看出,虽然只打印了book.name,但是在执行查询的语句的时候依旧查询了book.id, 并且在执行查询book.id之前并没有再次向数据库发起一次查询操作
    # 由此可以看出,数据库表中的id字段是不能进行操作的
    {'sql': 'SELECT `book`.`id`, `book`.`name` FROM `book`', 'time': '0.000'}]
    始于才华,忠于颜值;每件事情在成功之前,看起来都是天方夜谭。一无所有,就是无所不能。
  • 相关阅读:
    刷题-力扣-112. 路径总和
    刷题-力扣-1137. 第 N 个泰波那契数
    刷题-力扣-101. 对称二叉树
    刷题-力扣-99. 恢复二叉搜索树
    刷题-力扣-109. 有序链表转换二叉搜索树
    刷题-力扣-108. 将有序数组转换为二叉搜索树
    刷题-力扣-111. 二叉树的最小深度
    刷题-力扣-110. 平衡二叉树
    2019春Python程序设计练习6(0423--0429)
    2019春Python程序设计练习5(0416--0422)
  • 原文地址:https://www.cnblogs.com/guyan-2020/p/12270868.html
Copyright © 2011-2022 走看看