模型指的是真实世界对象的明确描述。它包含所需要的数据字段和行为。Django 遵循 DRY Principle :
- 明确优于隐式 - 行为基于关键字参数,并且在某些情况下,基于字段的类型。
- 包括所有相关领域逻辑 - 模型应该封装一个“对象”的各个方面,遵循 Martin Fowler 的 Active Record 设计模式,所有可用于理解该模型的信息都应该存储在该模型中。
Active Record 设计模式
比如这个 Person 对象,包含数据与行为,其内部定义了与数据库的交互行为。多个 Person 对象会以记录的形式,存储在数据库中。
1 定义模型
假设我们定义好了一个 app,名叫 chart。
之后,我们就可以在 chart/models.py 中,定义一个 Person 模型:
class Person(models.Model):
first_name=models.CharField(max_length=30)
last_name=models.CharField(max_length=30)
2 安装模型
为了在工程中包含这个 app,我们需要在配置类 INSTALLED_APPS 中添加设置。因为 app 的配置类(ChartConfig)写在文件 chart/apps.py 中,所以它的点式路径就是 ‘chart.apps.ChartConfig’。在文件 chart/settings.py 中 INSTALLED_APPS 子项内添加这个点式路径:
INSTALLED_APPS = [
'chart.apps.ChartConfig',
...
]
这时在项目路径下,执行以下命令:
python manage.py makemigrations chart
运行结果:
Migrations for ‘chart’:
chart\migrations\0001_initial.py
- Create model Person
makemigrations 命令的语法为 python manage.py makemigrations [app]
,它会比对模型版本,如果需要更新,会把需要更新的部分,存储在 migrations 目录中,为创建或更新模型做好准备:
生成的 0001_initial.py 内容如下:
from django.db import migrations, models
class Migration(migrations.Migration):
initial = True
dependencies = [
]
operations = [
migrations.CreateModel(
name='Person',
fields=[
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('first_name', models.CharField(max_length=30)),
('last_name', models.CharField(max_length=30)),
],
),
]
这是 Django 用于更新模型的代码。
manage.py 有一个 sqlmigrate,可用于打印模型迁移时,会执行的 SQL 语句,语法如下:
python manage.py sqlmigrate [app] [migrations 目录下,某个文件名中的编号]
比如,我们想要查看刚刚建立的迁移内容:
python manage.py sqlmigrate chart 0001
运行结果:
--
-- Create model Person
--
CREATE TABLE `chart_person` (`id` integer AUTO_INCREMENT NOT NULL PRIMARY KEY, `first_name` varchar(30) NOT NULL, `last_name` varchar(30) NOT NULL);
- 运行结果与我们所使用的数据库有关,上面的示例使用的是 MySQL。
- 数据库的表名是由 app 名(chart)和模型名的小写形式( people)使用下划线连接而来,可自定义。
- 会自动创建主键,可自定义。
- 外键字段名后会追加字符串 “_id” ,可自定义。
3 创建或更新模型
执行 migrate 指令,创建或更新模型:
python manage.py migrate
运行结果:
Running migrations:
Applying chart.0001_initial… OK
可以看到 MySQL 数据库中,已经建好了 chart_person 表咯:
Django 通过在数据库中 django_migrations 表来跟踪执行这些迁移:
Django 的迁移功能,可以让我们在开发过程中,改变数据库结构而不需要重新删除和创建表,使用它,可以让数据库实现平滑升级。
创建或更新模型三部曲:
- 在 app 的 models.py 文件,定义模型。
- 在 [app]/settings.py 中 INSTALLED_APPS 子项内,注册 app。(如果已注册,可跳过该步骤)
- 运行
python manage.py makemigrations [app]
把变化的模型生成相应的迁移文件。 - 运行
python manage.py migrate
更新数据库。