为什么要用ORM模型
1、在前面那章中我们介绍了如何在Django中使用原生SQL来操作数据库:直接在视图函数中执行对应的SQL语句
2、随着项目越来越大,如果一直采用原生SQL的方式,那么在代码中会出现大量的SQL语句,就会出现很多问题:
⑴SQL语句重复利用率不高,越复杂的SQL语句条件越多,代码越长,会出现很多相近的SQL语句
⑵很多SQL语句是在业务逻辑中拼接出来的,如果有数据需要更改,就需要去修改这些逻辑,这就会很容易漏掉某些SQL的修改
⑶写SQL时容易忽略Web安全问题,比如SQL注入等
ORM模型介绍
1、ORM,全称Object Relational Mapping,中文叫做对象关系映射,通过ORM我们可以通过类的方式去操作数据库,而不用再写原生的SQL语句。通过把表映射成类,把行作为实例,把字段作为属性,ORM在执行对象操作的时候最终还是会把对应的操作转换为数据库原生语句。使用ORM有许多优点:
⑴易用性:使用ORM做数据库的开发可以有效的减少重复SQL语句的概率,写出来的模型也更加直观、清晰
⑵性能损耗小:ORM转换成底层数据库操作指令确实会有一些开销。但从实际的情况来看,这种性能损耗很少(不足5%),只要不是对性能有严苛的要求,综合考虑开发效率、代码的阅读性,带来的好处要远远大于性能损耗,而且项目越大作用越明显。
⑶设计灵活:可以轻松的写出复杂的查询。
⑷可移植性:Django封装了底层的数据库实现,支持多个关系数据库引擎,包括流行的MySQL、PostgreSQL和SQLite。可以非常轻松的切换数据库
2、模型是一个用于表示数据的Python类,包含基本的数据字段和行为,在Django中,通常一个模型(类)就代表一个数据库表
⑴模型类必须继承于"django.db.models.Model"或其子类
⑵模型类的每一个属性代表一个数据表的列
创建ORM模型
ORM模型一般都是放在app的models.py文件中。每个app都可以拥有自己的模型。并且如果这个模型想要映射到数据库中,那么这个app必须要放在settings.py的INSTALLED_APP中进行安装、注册
⑴定义一个模型类(数据库表)一般是在对应应用程序APP下的models.py文件中
⑵在定义好一个模型类(数据库表)后,这个模型类要正常的映射到数据库中的话,那这个应用程序APP必须要在settings.py的INSTALLED_APP中进行安装
⑶O(objects):类和对象
⑷R(Relation):关系,关系数据库中的表格
⑸M(Mapping):映射
ORM框架功能
1、建立模型类和表之间的对应关系,允许我们通过面向对象的方式来操作数据库
2、根据设计的模型类生成数据库中的表格
3、通过配置就可以进行数据库的切换
例1:定义一个模型类
⑴定义模型类
注:以上便定义了一个模型
1、这个模型继承自django.db.models.Model,如果这个模型想要映射到数据库中,就必须继承自这个类或其子类
①如果要将一个普通的类变成一个可以映射到数据库中的ORM模型,那么必须要将父类设置为"models.Model"或者其子类(模型类必须继承于models.Model)
2、从上面例子中可以看出:其实定义一个模型类跟在Python脚本中定义一个类是差不多的,只是说为模型类时,对应的是数据库的表的结构
①模型类中的类名:对应的是数据库表的表名(模型类映射到数据库中后,表名是模型类类名的小写形式,为book)
②模型类中的类属性名:对应着数据库表的列名
③模型类中的类属性的值:对应的数据库表列的属性
④模型类中的类属性的值调用的方法(models.方法名):表示定义数据库表中该列值的属性(值类型)。值的其他属性在方法函数中以参数的形式传入
3、在这个模型类中定义了五个类属性,即对应着数据库表中的五列
①第一个类属性名为"id":表示数据库表的一列,列名为id。其属性为自动增长(models.AutoField:自动增长),且其为表的主键(primary_key=True)
②第二个类属性名为"name":表示数据库表的一列,列名为name。其属性为字符串型(models.CharField),且值最大长度为100(max_length=100),且值不能为空(null=False)
③第三个类属性名为"a