django的ORM模型的实现原理


Posted in Python onMarch 04, 2019

ORM模型介绍

随着项目越来越大,采用写原生SQL的方式在代码中会出现大量的SQL语句,那么问题就出现了:

  1. SQL语句重复利用率不高,越复杂的SQL语句条件越多,代码越长。会出现很多相近的SQL语句。
  2. 很多SQL语句是在业务逻辑中拼出来的,如果有数据库需要更改,就要去修改这些逻辑,这会很容易漏掉对某些SQL语句的修改。
  3. 写SQL时容易忽略web安全问题,给未来造成隐患。SQL注入。

ORM ,全称 Object Relational Mapping ,中文叫做对象关系映射,通过 ORM 我们可以通过类的方式去操作数据库,而不用再写原生的SQL语句。通过把表映射成类,把行作实例,把字段作为属性, ORM 在执行对象操作的时候最终还是会把对应的操作转换为数据库原生语句。使用 ORM 有许多优点:

  • 易用性:使用 ORM 做数据库的开发可以有效的减少重复SQL语句的概率,写出来的模型也更加直观、清晰。
  • 性能损耗小: ORM 转换成底层数据库操作指令确实会有一些开销。但从实际的情况来看,这种性能损耗很少(不足5%),只要不是对性能有严苛的要求,综合考虑开发效率、代码的阅读性,带来的好处要远远大于性能损耗,而且项目越大作用越明显。
  • 设计灵活:可以轻松的写出复杂的查询。
  • 可移植性: Django 封装了底层的数据库实现,支持多个关系数据库引擎,包括流行的 MySQL 、 PostgreSQL 和 SQLite 。可以非常轻松的切换数据库。

创建ORM模型

ORM 模型一般都是放在 app 的 models.py 文件中。每个 app 都可以拥有自己的模型。并且如果这个模型想要映射到数据库中,那么这个 app 必须要放在 settings.py 的 INSTALLED_APP 中进行安装。以下是写一个简单的书籍 ORM 模型。示例代码如下:

from django.db import models
class Book(models.Model):
 name = models.CharField(max_length=20,null=False)
 author = models.CharField(max_length=20,null=False)
 pub_time = models.DateTimeField(default=datetime.now)
 price = models.FloatField(default=0)

以上便定义了一个模型。这个模型继承自 django.db.models.Model ,如果这个模型想要映射到数据库中,就必须继承自这个类。这个模型以后映射到数据库中,表名是模型名称的小写形式,为 book 。在这个表中,有四个字段,一个为 name ,这个字段是保存的是书的名称,是 varchar 类型,最长不能超过20个字符,并且不能为空。第二个字段是作者名字类型,同样也是 varchar 类型,长度不能超过20个。第三个是出版时间,数据类型是 datetime 类型,默认是保存这本书籍的时间。第五个是这本书的价格,是浮点类型。

还有一个字段我们没有写,就是主键 id ,在 django 中,如果一个模型没有定义主键,那么将会自动生成一个自动增长的 int 类型的主键,并且这个主键的名字就叫做 id 。

映射模型到数据库中:

将 ORM 模型映射到数据库中,总结起来就是以下几步:

  1. 在 settings.py 中,配置好 DATABASES ,做好数据库相关的配置。
  2. 在 app 中的 models.py 中定义好模型,这个模型必须继承自 django.db.models 。
  3. 将这个 app 添加到 settings.py 的 INSTALLED_APP 中。
  4. 在命令行终端,进入到项目所在的路径,然后执行命令 python manage.py makemigrations 来生成迁移脚本文件。
  5. 同样在命令行中,执行命令 python manage.py migrate 来将迁移脚本文件映射到数据库中。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
python中input()与raw_input()的区别分析
Feb 27 Python
Python和C/C++交互的几种方法总结
May 11 Python
查找python项目依赖并生成requirements.txt的方法
Jul 10 Python
对tensorflow 的模型保存和调用实例讲解
Jul 28 Python
python使用writerows写csv文件产生多余空行的处理方法
Aug 01 Python
python关闭占用端口方式
Dec 17 Python
tensorflow没有output结点,存储成pb文件的例子
Jan 04 Python
Python中itertools的用法详解
Feb 07 Python
Python实现结构体代码实例
Feb 10 Python
Python如何定义有可选参数的元类
Jul 31 Python
13个Pandas实用技巧,助你提高开发效率
Aug 19 Python
Python的scikit-image模块实例讲解
Dec 30 Python
Python中按值来获取指定的键
Mar 04 #Python
python实现合并两个排序的链表
Mar 03 #Python
Python给图像添加噪声具体操作
Mar 03 #Python
django配置连接数据库及原生sql语句的使用方法
Mar 03 #Python
更新修改后的Python模块方法
Mar 03 #Python
详解js文件通过python访问数据库方法
Mar 03 #Python
Python中的random.uniform()函数教程与实例解析
Mar 02 #Python
You might like
ZF框架实现发送邮件的方法
2015/12/03 PHP
php集成开发环境详解
2019/09/24 PHP
jQuery基础知识filter()和find()实例说明
2010/07/06 Javascript
iframe父页面获取子页面参数的方法
2014/02/21 Javascript
JS实现点击颜色块切换指定区域背景颜色的方法
2015/02/25 Javascript
pace.js页面加载进度条插件
2015/09/29 Javascript
jQuery 1.9.1源码分析系列(十)事件系统之绑定事件
2015/11/19 Javascript
js传值后台中文出现乱码的解决方法
2016/06/30 Javascript
easyui combobox开启搜索自动完成功能的实例代码
2016/11/08 Javascript
Vue开发过程中遇到的疑惑知识点总结
2017/01/20 Javascript
jQuery弹出窗口简单实现代码
2017/03/09 Javascript
bootstrap table实现双击可编辑、添加、删除行功能
2017/09/27 Javascript
Node.js微信 access_token ( jsapi_ticket ) 存取与刷新的示例
2017/09/30 Javascript
vue自定v-model实现表单数据双向绑定问题
2018/09/03 Javascript
微信小程序基于picker实现级联菜单
2019/02/15 Javascript
JS把字符串格式的时间转换成几秒前、几分钟前、几小时前、几天前等格式
2019/07/10 Javascript
解决Vue router-link绑定事件不生效的问题
2020/07/22 Javascript
vue实现动态给id赋值,点击事件获取当前点击的元素的id操作
2020/11/09 Javascript
[02:45]DOTA2英雄基础教程 伐木机
2013/12/23 DOTA
浅谈python下tiff图像的读取和保存方法
2018/12/04 Python
Python中asyncio模块的深入讲解
2019/06/10 Python
python将三维数组展开成二维数组的实现
2019/11/30 Python
Python json读写方式和字典相互转化
2020/04/18 Python
python中selenium库的基本使用详解
2020/07/31 Python
HTML5对手机页面长按会粘贴复制禁用的解决方法
2016/07/19 HTML / CSS
意大利制造的西装、衬衫和针对男士量身定制的服装:Lanieri
2018/04/08 全球购物
乌克兰排名第一的在线旅游超市:Farvater.Travel
2020/01/02 全球购物
西班牙购买隐形眼镜、眼镜和太阳镜网站:Lentiamo.es
2020/06/11 全球购物
EJB的几种类型
2012/08/15 面试题
取保候审保证书
2014/04/30 职场文书
2014年党支部学习材料
2014/05/19 职场文书
党员评议个人总结
2014/10/20 职场文书
合同纠纷调解书
2015/05/20 职场文书
2016年幼儿园教研活动总结
2016/04/05 职场文书
“鬼灭之刃”热度不减,其成功背后的原因是什么?
2022/03/22 日漫
GoFrame框架数据校验之校验结果Error接口对象
2022/06/21 Golang