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

Posted zheng-weimin

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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"

 


以上是关于093:QuerySet API详解-QuerySet转换为SQL的条件的主要内容,如果未能解决你的问题,请参考以下文章

091:QuerySet API详解-update和delete

079:Django数据库QuerySet API详解-filterexcludeannotate

081:QuerySet API详解-values和values_list

090:QuerySet API详解-distinct

87.QuerySet API使用详解:create方法

089:QuerySet API详解-count和exists