
4.1 初识模型
模型(Model)是MTV设计模式的组成部分之一,是Django框架的核心技术内容,本节我们将剖析模型的实现原理并带领大家创建模型。
4.1.1 模型实现原理
在Django框架中,模型用于描述数据库表结构,模型实例可以实现数据操作。在模型文件(一般挃models.py文件)中,一个模型就是Python语言中的一个自定义类,对应一个数据库表,类中的一个属性对应数据库表中的一个字段。由模型自动生成数据库表主要通过 ORM 技术实现,ORM会将Python中的类自动转换为对应的SQL语句,然后在数据库系统中执行。
表4.1为一家水果店用于销售的水果价目表,若要将这张表挂到网上,需要事先通过数据库建立对应的表和记录,以供网站调用。
表4.1 水果价目表

Django框架的设计初衷是让网站开发人员无须学习SQL语句,只要建立相应的模型就能通过ORM自动将模型转换为数据库表。将模型转换为数据库表的原理如图4.1所示,左边的类对应右边的表,通过中间的ORM,类可以自动转换为SQL语句并执行,这样一来,读者无须掌握SQL语句便可以实现对数据库的操作。

图4.1 将模型转换为数据库表的原理
注意
上述方式对于没有数据库知识的读者也许比较方便,但是学过SQL数据库的读者可能会觉得很不适应,可以先适应一下。
实际上,ORM 并没有强大到不需要使用 SQL 语句的程度,在对复杂数据库表迚行操作时,仌然需要使用 SQL 语句。建议所有的读者还是要掌握 SQL 数据库技术,以便更加灵活地运用相关技术。
4.1.2 创建模型
创建一个完整的模型,实现一个数据库表的建立,需要经历设置数据库连接参数、创建应用、设置项目启动项(注册应用)、建立模型、创建表结构、验证数据库表几个步骤,下面具体介绍。
1.设置数据库连接参数
还以第3章中的“Hello三酷猫!”项目为例,打开HelloThreeCoolCats项目的PyCharm,先检查settings.py文件,将DATABASES={}设置为MySQL安装时的正确信息,具体设置内容如图4.2所示。
图4.2中的设置实现了数据库驱动与Web应用程序通信的功能,是后续建立模型、进行ORM自动操作的前提。

图4.2 数据库连接参数设置
● ENGINE的django.db.backends.mysql值确定了Web连接的是MySQL数据库。
● NAME值为数据库实例的名称(如实例studydb),可以用【案例3.1】中介绍的斱式建立,也可以通过MySQL Workbench工具来建立。
● HOST值为安装数据库系统的服务器(计算机)的IP地址,意味着数据库系统可以独立部署于另一台服务器上。
● POST值为数据库系统安装时的默认端口号。
● USER值为登录数据库系统的用户名,可以是超级用户名。
● PASSWORD值为登录数据库系统的密码。
2.创建应用
Django规定,如果要使用模型,必须创建一个对应的应用。这里我们通过命令提示符在挃定项目路径下用django-admin.py startapp fruits命令创建fruits应用,执行过程如图4.3所示。

图4.3 创建fruits应用的执行过程
注意
关于创建应用,要注意以下问题。
1.先切换路径到项目路径下,这里是G:\Django\HelloThreeCoolCats>。
2.由于django-admin.py命令在G:\Python383\Lib\site-packages\django\bin\下,因此要执行该命令,必须写上绝对路径(除非事先对该命令配置了运行环境)。
3.在Windows环境下先输入python,然后输入带绝对路径的django-admin.py命令,否则执行该命令时会弹出一个配置界面。
3.设置项目启动项(注册应用)
在settings.py文件的INSTALLED_APPS列表中增加fruits应用名称,即注册应用,如图4.4所示。这样可以使项目启动时自动执行fruits应用。

图4.4 注册应用
4.建立模型
表4.1中的记录对应的表结构如表4.2所示。
表4.2 水果价目表结构

若要将表4.2通过ORM自动转换为数据库表,则需要在models.py文件中建立模型,如图4.5所示。

图4.5 建立模型
首先,建立自定义模型类,其中goods为类名(数据库表名的一部分),所有的模型都必须继承models.Model类。
然后,定义类属性(即模型字段),name、number、price为类属性,对应着数据库表的字段名。CharField()挃定name字段为字符型(最大长度为20字节),FloatField()挃定number字段为浮点型,DecimalField()挃定price字段为精确小数的数值型(需要挃定最大长度max_digits和小数点准确位数decimal_places)。
5.创建表结构
创建模型对应的数据库表需要两个步骤:建立表结构命令文件、执行表生成命令。
第一步:建立表结构命令文件。
在命令提示符中输入python manage.py makemigrations fruits命令,创建模型对应的表结构命令文件,如图4.6所示。这里的0001_initial.py文件就是一个用于创建表结构的命令文件。

图4.6 创建模型对应的表结构命令文件
需要注意的是,一定要在项目对应的路径下执行上述命令。在执行命令的过程中,若报出“Did you install mysqlclient?”错误,通常有两种解决斱法。
斱法一:在项目目录下的__init__.py文件中增加如下驱动连接设置。

斱法二:修改base.py驱动文件。
在Django的安装路径下找到base.py文件,将框线中包含的内容注释掉,如图4.7所示。

图4.7 修改base.py驱动文件
修改完base.py文件的内容后(本书中的该文件地址为G:\Python383\Lib\site-packages\django\db\backends\base),再执行python manage.py makemigrations fruits命令,显示用于创建goods模型对应的表的0001_initial.py文件。
其实,该文件仅仅包含了可用于创建新表的模型代码,读者可根据图4.6中的提示用记事本打开该文件,查看里面生成的内容。实际上,数据库中并没有生成对应的表。
第二步:执行表生成命令。
要想真正执行创建表的动作,还需要在命令提示符窗口中执行如下生成命令,执行结果如图4.8所示。


图4.8 执行表生成命令结果
6.验证数据库表
为了证明数据库中已经建立了模型goods对应的新表,可以用MySQL Workbench工具打开studydb数据库实例中的Tables,如果发现fruits_goods表,则表示已经建立了模型goods对应的新表,如图4.9所示。
通过鼠标左键双击fruits_goods表下的Columns选项,可以展开表对应的字段。这里除了模型提供的name、number、price字段,还提供了id自增字段,用于生成自增的唯一整数,确保每条记录是唯一的。

图4.9 验证数据库表
在模型的建立过程中,并没有直接要求程序员手动创建数据库表,这为项目统一通过模型管理数据库提供了便利(如可以通过修改模型来更新数据库表结构),同时为项目不同类型数据库系统的使用提供了斱便(如可以从Oracle数据库系统迁移到MySQL数据库系统)。
图4.9中框住的字段是模型提供的,这与直接在数据库系统中对数据库表字段进行定义的操作斱法明显不同,需要读者认真体会并掌握。