93.QuerySet转换为SQL的条件:迭代,切片(指定步长),len函数,list函数,判断

生成一个QuerySet对象并不会马上转换为SQL语句去执行。

books = Book.objects.filter(pk=3)
print(connection.queries)

打印出django底层执行的sql语句:是一个空的列表[]

在以下情况下QuerySet会被转换为SQL语句执行:
1. 迭代:在遍历QuerySet对象的时候,会执行这个sql语句,然后再把执行的结果返回进行迭代,比如,以下代码:
def index(request):
    books = Book.objects.all()
    for book in books:
        print(book)
    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': 'SELECT `book`.`id`, `book`.`name`, `book`.`pages`, `book`.`price`, `book`.`rating`, `book`.`author_id`, `book`.`publisher_id`, `book`.`score` FROM `book`', 'time': '0.000'}]

2. 使用步长做切片操作,QuerySet可以类似于列表一样做切片操作,但是在做切的操作时本身并不会执行sql语句,如果在做切片操作的时候提供了步长,那么就会执行sql语句,需要注意的是在做切片之后不能再做filter操作,否者的话就会报错。示例代码如下:
# 在做切片操作的时候【start,end,步长】,注意:不包括end位置的数据
    books = Book.objects.all()[0:6:2]
    for book in books:
        print(book)
    print(connection.queries)
    return HttpResponse('SUCCESS')

返回的结果如下:

# 每两条数据去一条
Book object (1)
Book object (3)
Book object (5)
[{'sql': 'SELECT @@SQL_AUTO_IS_NULL', 'time': '0.000'}, 
{'sql': 'SET SESSION TRANSACTION ISOLATION LEVEL READ COMMITTED', 'time': '0.016'}, 
{'sql': 'SELECT `book`.`id`, `book`.`name`, `book`.`pages`, `book`.`price`, `book`.`rating`, `book`.`author_id`, `book`.`publisher_id`, `book`.`score` FROM `book` LIMIT 6', 'time': '0.000'}]
3. 调用len()函数:调用len函数用来获取QuerySet中共有多少条数据也会执行sql语句。
def index(request):
    # 调用len函数
    books = Book.objects.filter(bookorder__price__gt=90)
    print(len(books))
    print(connection.queries)
    return HttpResponse('SUCCESS')

执行的结果如下:

1
[{'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` INNER JOIN `book_order` ON (`book`.`id` = `book_order`.`book_id`) WHERE `book_order`.`price` > 90.0e0', 'time': '0.000'}]

4. 调用list函数:调用list函数用来将一个QuerySet对象转化为list对象也会立马执行sql语句。示例代码如下:
def index(request):
    books = Book.objects.all()
    print(list(books))
    print(connection.queries)
    return HttpResponse('SUCCESS')
[{'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`', 'time': '0.000'}]

5. 判断:如果对某个QuerySet进行判断,也会立马执行sql语句,示例代码如下:
def index(request):
    books = Book.objects.filter(bookorder__price__gte=90)
    if books:
        for book in books:
            print(book)
    print(connection.queries)
    return HttpResponse('SUCCESS')

打印出结果:

Book object (2)
[07/Feb/2020 13:56:18] "GET / HTTP/1.1" 200 7
[{'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` INNER JOIN `book_order` ON (`book`.`id` = `book_order`.`book_id`) WHERE `book_order`.`price` >= 90.0e0', 'time': '0.000'}]

posted @ 2020-02-07 14:15  一笑而过~一笑奈何  阅读(273)  评论(0编辑  收藏  举报