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多线程http下载实现示例
Dec 30 Python
python使用cStringIO实现临时内存文件访问的方法
Mar 26 Python
Python简明入门教程
Aug 04 Python
python开发之thread线程基础实例入门
Nov 11 Python
详解python string类型 bytes类型 bytearray类型
Dec 16 Python
Python子类继承父类构造函数详解
Feb 19 Python
windows下Python安装、使用教程和Notepad++的使用教程
Oct 06 Python
python 三种方法实现对Excel表格的读写
Nov 19 Python
python字符串拼接+和join的区别详解
Dec 03 Python
python第三方网页解析器 lxml 扩展库与 xpath 的使用方法
Apr 06 Python
python 如何获取页面所有a标签下href的值
May 06 Python
Python数据可视化之Seaborn的安装及使用
Apr 19 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
是否存在第一台收音机的说法
2021/03/01 无线电
浅析is_writable的php实现
2013/06/18 PHP
php另类上传图片的方法(PHP用Socket上传图片)
2013/10/30 PHP
ThinkPHP3.1.3版本新特性概述
2014/06/19 PHP
ThinkPHP采用原生query实现关联查询left join实例
2014/12/02 PHP
PHP实现的浏览器检查类
2016/04/11 PHP
页面中iframe相互传值传参
2009/12/13 Javascript
js传中文参数controller里获取参数乱码问题解决方法
2014/01/03 Javascript
jquery实现的树形目录实例
2015/06/26 Javascript
Extjs实现下拉菜单效果
2016/04/01 Javascript
通过bootstrap全面学习less
2016/11/09 Javascript
js前端实现多图图片上传预览的两个方法(推荐)
2016/11/18 Javascript
解决vue attr取不到属性值的问题
2018/09/18 Javascript
vue中对象数组去重的实现
2020/02/06 Javascript
解决vue-cli@3.xx安装不成功的问题及搭建ts-vue项目
2020/02/09 Javascript
python中assert用法实例分析
2015/04/30 Python
python3获取当前文件的上一级目录实例
2018/04/26 Python
详解python selenium 爬取网易云音乐歌单名
2019/03/28 Python
python使用Paramiko模块实现远程文件拷贝
2019/04/30 Python
python ctypes库2_指定参数类型和返回类型详解
2019/11/19 Python
pandas实现将日期转换成timestamp
2019/12/07 Python
python中threading开启关闭线程操作
2020/05/02 Python
python+requests接口自动化框架的实现
2020/08/31 Python
python中的yield from语法快速学习
2020/11/06 Python
python中re模块知识点总结
2021/01/17 Python
精灵市场:Pixie Market
2019/06/18 全球购物
北京捷通华声语音技术有限公司Java软件工程师笔试题
2012/04/10 面试题
过程装备与控制工程专业个人的求职信
2013/12/01 职场文书
采购部部长岗位职责
2014/02/06 职场文书
环保倡议书
2014/04/14 职场文书
大学生党员承诺书
2014/05/20 职场文书
毕业生登记表班级意见
2015/06/05 职场文书
互联网的下一个风口:新的独角兽将诞生
2019/08/02 职场文书
MySQL root密码的重置方法
2021/04/21 MySQL
python本地文件服务器实例教程
2021/05/02 Python
MySQL中JOIN连接的基本用法实例
2022/06/05 MySQL