Python Django orm操作数据库笔记之QuerySet API
什么时候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的更多相关文章
- Python Django orm操作数据库笔记之外键和表关系
外键 在MySQL中,表有两种引擎,一种是InnoDB,另外一种是myisam.如果使用的是InnoDB引擎,是支持外键约束的. 外键的使用 使用外键前需要先确保相应外键已存储在数据库中(flask中 ...
- Django ORM操作数据库常用API
昨天晚上,我们完成了一个简单的实例来对数据库表进行操作.今天,我们要熟悉更多的API,实现更复杂的功能.这一步完成了,我们对小型数据的操作问题也就不大了. 现在,我们还是参考django官方文档,来进 ...
- Django学习——静态文件配置、request对象方法、pycharm如何链接数据库、Django如何指定数据库、Django orm操作
静态文件配置 # 1.静态文件 网站所使用的已经提前写好的文件 css文件 js文件 img文件 第三方文件 我们在存储静态文件资源的时候一般默认都是放在static文件夹下 # 2.Django静态 ...
- [oldboy-django][2深入django]ORM操作
推荐学习博客:http://www.cnblogs.com/wupeiqi/articles/6216618.html 需求: 汇总django orm操作,代替原生mysql语句来操作数据库:里面内 ...
- python——django使用mysql数据库(二)
上一篇中,我们已经讲述了如何初始化一个django数据库,这一章就来讲讲在实际的项目中如何使用我们初始化的数据库呢? 如还未进行初始化数据库操作,请参考python——django使用mysql数据库 ...
- python——django使用mysql数据库(一)
之前已经写过如何创建一个django项目,现在我们已经有了一个小骷髅,要想这个web工程变成一个有血有肉的人,我们还需要做很多操作.现在就先来介绍如何在django中使用mysql数据库. 前提:已经 ...
- 数据库开发-Django ORM的数据库迁移
数据库开发-Django ORM的数据库迁移 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一. Django 项目准备 1>.安装django包 pip install d ...
- python MySQLdb用法,python中cursor操作数据库(转)
数据库连接 连接数据库前,请先确认以下事项: 您已经创建了数据库 TESTDB. 在TESTDB数据库中您已经创建了表 EMPLOYEE EMPLOYEE表字段为 FIRST_NAME, LAST_N ...
- python高级之操作数据库
python高级之操作数据库 本节内容 pymysql介绍及安装 使用pymysql执行sql 获取新建数据自增ID fetch数据类型设置 1.pymysql介绍及安装 在python2中连接数据库 ...
随机推荐
- 使用excel估计GARCH模型参数——以GARCH(1,1)为例
本文的知识点:使用excel求解GARCH模型的系数,以GARCH模型为例,主要采用的是极大似然估计法MLE. 同时给出了R语言的输出结果作为对照验证. 参考了:http://investex ...
- springCloud全家桶
Spring Cloud 入门教程(一): 服务注册 eureka是一个高可用的组件,它没有后端缓存,每一个实例注册之后需要向注册中心发送心跳,在默认情况下erureka server也是一个eure ...
- 【JS】【5】request.getHeader("referer")的作用
正文: request.getHeader("referer"):获取来访者地址 注意:只有通过链接访问当前页的时候,才能获取上一页的地址,以下情况是获取不到值的: 只有通过链接访 ...
- weex playGround 扫码空白问题
首先安装 weex debug 用 weex debug调试可以看到报错 我做的demo扫码扫不出来 是因为:class的原因 weex中:class只支持数组形式 或者 换成:style就可以 ...
- [poj P2411] Mondriaan's Dream
[poj P2411] Mondriaan's Dream Time Limit: 3000MS Memory Limit: 65536K Total Submissions: 18023 A ...
- vscode keys
// 快捷键设置 keyiing.json // 将键绑定放入此文件中以覆盖默认值 [ /* // 转换大写 { "key" : "ctrl+shift+u", ...
- animation特效
在小程序中的使用: <view class='test1'> <image src='/images/light.png'></image> </view&g ...
- Json 网络传递解析异常
在项目中碰到一个bug,A项目请求B项目,获取到的Json无法解析,B项目封装的Json,在项目内部可以正常解析,问题并不是Json 解析的错误,而是实体Bean中有数组类型的字段;解决办法就是对封装 ...
- js获取html元素在可视区域的位置
1)html节点在可视区域的位置 obj.getBoundingClientRect().top obj.getBoundingClientRect().left 2) 获取鼠标按下的位置 event ...
- spoj mgame
题解: f[i][j]表示先后手最大差 g[i][j]表示在最大差的时候是否有后手没得走 代码: #include<bits/stdc++.h> using namespace std; ...