093:QuerySet API详解-QuerySet转换为SQL的条件

QuerySet API详解-QuerySet转换为SQL的条件:

生成一个 QuerySet 对象并不会马上转换为 SQL 语句去执行。比如我们获取 Book 表下所有的图书:

    books = Book.objects.all()
    print(connection.queries)

我们可以看到在打印 connection.quries 的时候打印的是一个空的列表。说明上面的 QuerySet 并没有真正的执行。

在以下情况下 QuerySet 会被转换为 SQL 语句执行:
1、迭代:在遍历 QuerySet 对象的时候,会首先先执行这个 SQL 语句,然后再把这个结果返回进行迭代。比如以下代码就会转换为 SQL 语句:

    for item in books:
        print(item.name)

2、使用步长做切片操作: QuerySet 可以类似于列表一样做切片操作。做切片操作本身不会执行 SQL 语句,但是如果如果在做切片操作的时候提供了步长,那么就会立马执行 SQL 语句。需要注意的是,做切片后不能再执行 filter 方法,否则会报错;

books = Book.objects.get_queryset()[1:2:2]

3、调用 len 函数:调用 len 函数用来获取 QuerySet 中总共有多少条数据也会执行 SQL 语句;

    print(len(books))

4、调用 list 函数:调用 list 函数用来将一个 QuerySet 对象转换为 list 对象也会立马执行SQL语句;

    print(list(books))

5、判断:如果对某个 QuerySet 进行判断,也会立马执行 SQL 语句;

  if books:
      print"bababa"

 

posted @ 2019-01-18 14:31  zheng-weimin  阅读(338)  评论(0编辑  收藏  举报