什么时候Django会将QuerySet转换为SQL去执行:

根据Django的数据库机制,对于QuerySet来说,当QuerySet被第一次构建,然后又调用他的filter方法,接着在对其进行切片操作的过程中,Django其实并没有去访问数据库。只有当你对QuerySet进行求值时,Django才会去访问数据库。

在以下情况下QuerySet会被转换为SQL语句执行:

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

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

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

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

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

1.defer和only方法

这两个方法都是返回一个QuerySet对象,并且这个QuerySet对象包裹的是相应的模型,而不是字典,且使用这两个方法过滤或只提取某几个字段后,再使用已被过滤或者未提取的某个字段时,系统会重新发送一次查询请求。因此要慎重操作。

defer:过滤相应字段(一个或多个)

only:只提取相应字段(一个或多个)

2.get

作用是获取满足条件的一条数据,需要注意的是该函数只能令其返回有且只有一条数据,因此如果给出的条件有多条数据满足那么这个方法将会抛出MultipleObjectsReturned错误,如果没有数据满足,那么将会抛出DoesNotExit错误。

3.create

创建一条数据,并将其保存到数据库中

4.get_or_create

根据某个条件进行查找,如果找到了那么就返回这条数据,如果没有查找到,那么就创建一个。

5.bulk_create

可以接收一个列表参数,并根据列表内元素一次性创建多条数据。通过该方法向数据库插入数据时仅生成一条SQL语句。

6.distinct

去除掉那些重复的数据。这个方法如果底层数据库用的是MySQL,那么不能传递任何的参数。需要注意的是distinct方法判断数据是否重复的依据是数据中的每一个字段都同。

7.切片操作

QuerySet使用切片操作就跟列表使用切片操作是一样的。示例代码如下:

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

切片操作并不是把所有数据从数据库中提取出来再做切片操作。而是在数据库层面使用LIMIE和OFFSET来帮我们完成。

Python Django orm操作数据库笔记之QuerySet API的更多相关文章

  1. Python Django orm操作数据库笔记之外键和表关系

    外键 在MySQL中,表有两种引擎,一种是InnoDB,另外一种是myisam.如果使用的是InnoDB引擎,是支持外键约束的. 外键的使用 使用外键前需要先确保相应外键已存储在数据库中(flask中 ...

  2. Django ORM操作数据库常用API

    昨天晚上,我们完成了一个简单的实例来对数据库表进行操作.今天,我们要熟悉更多的API,实现更复杂的功能.这一步完成了,我们对小型数据的操作问题也就不大了. 现在,我们还是参考django官方文档,来进 ...

  3. Django学习——静态文件配置、request对象方法、pycharm如何链接数据库、Django如何指定数据库、Django orm操作

    静态文件配置 # 1.静态文件 网站所使用的已经提前写好的文件 css文件 js文件 img文件 第三方文件 我们在存储静态文件资源的时候一般默认都是放在static文件夹下 # 2.Django静态 ...

  4. [oldboy-django][2深入django]ORM操作

    推荐学习博客:http://www.cnblogs.com/wupeiqi/articles/6216618.html 需求: 汇总django orm操作,代替原生mysql语句来操作数据库:里面内 ...

  5. python——django使用mysql数据库(二)

    上一篇中,我们已经讲述了如何初始化一个django数据库,这一章就来讲讲在实际的项目中如何使用我们初始化的数据库呢? 如还未进行初始化数据库操作,请参考python——django使用mysql数据库 ...

  6. python——django使用mysql数据库(一)

    之前已经写过如何创建一个django项目,现在我们已经有了一个小骷髅,要想这个web工程变成一个有血有肉的人,我们还需要做很多操作.现在就先来介绍如何在django中使用mysql数据库. 前提:已经 ...

  7. 数据库开发-Django ORM的数据库迁移

    数据库开发-Django ORM的数据库迁移 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一. Django 项目准备 1>.安装django包 pip install d ...

  8. python MySQLdb用法,python中cursor操作数据库(转)

    数据库连接 连接数据库前,请先确认以下事项: 您已经创建了数据库 TESTDB. 在TESTDB数据库中您已经创建了表 EMPLOYEE EMPLOYEE表字段为 FIRST_NAME, LAST_N ...

  9. python高级之操作数据库

    python高级之操作数据库 本节内容 pymysql介绍及安装 使用pymysql执行sql 获取新建数据自增ID fetch数据类型设置 1.pymysql介绍及安装 在python2中连接数据库 ...

随机推荐

  1. (转)决定系数R2

    有些讲得太烂了,我来通俗的梳理一下R2. Calculating R-squared 在线性回归的模型下,我们可以计算SE(line), SE(y均值). The statistic R2descri ...

  2. Lab 6-4

    In this lab, we'll analyze the malware found in the file Lab06-04.exe. Questions and Short Answers W ...

  3. Symbol Vs String

    最重要区别 1 symbol存入内存后,始终存在,如果不进行垃圾收集,可能导致内存泄漏. String只会存在于某个创建它的作用域内.即有生命周期的. 2.唯一性. \\进入控制台 >" ...

  4. 深入理解Plasma(三)Plasma MVP

    这一系列文章将围绕以太坊的二层扩容框架 Plasma,介绍其基本运行原理,具体操作细节,安全性讨论以及未来研究方向等.本篇文章主要介绍 Plasma 的一个最小实现 Plasma MVP(Minima ...

  5. JQuery 获取select被选中的value和text

    html代码: <select name="test" > <option value="0">请选择</option> & ...

  6. Matlab:导数边界值的有限元(Ritz)法

    tic; % this method is transform from Ritz method %is used for solving two point BVP %this code was w ...

  7. vue中关于v-for性能优化---track-by属性

    vue中关于v-for性能优化---track-by属性 最近看了一些react,angular,Vue三者的对比文章,对比来说Vue比较突出的是轻量级与易上手. 对比Vue与angular,Vue有 ...

  8. Elasticsearch5.5通过案例学习简单操作

    1. 建立员工目录 ES数据库对象与关系型数据库对象对比 Relational DB -> Databases -> Tables -> Rows -> ColumnsElas ...

  9. GIS中的引擎:地图引擎

    什么是地图引擎?它和地图软件有什么区别? 引擎一词是英文单词engine的音译,通常指发动机,就是动力输出设备.诸如汽车.轮船.飞机的动力提供的核心设备就是引擎.IT领域中,常听说的有搜索引擎.图形引 ...

  10. 如何设置IntelliJ IDEA智能感知支持Jsp内置对象

    一.问题: 在IntelliJ IDEA 新建jsp页面,想通过内置对象获取查询参数,比如:request.getParameter("id"),虽然手动输入后能够运行成功,但是智 ...