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语句为:python

[{'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

[{'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'}]
相关文章
相关标签/搜索