模型指的是真實世界對象的明確描述。它包含所需要的數據字段和行爲。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
更新數據庫。