1. 模型簡介
ORM 簡介
MVC 框架中一個重要的部分就是 ORM,它實現了數據模型與數據庫的解耦,即數據模型的設計不需要依賴于特定的數據庫,通過簡單的配置就可以輕松更換數據庫。即直接面向對象操作數據,無需考慮 sql 語句。
ORM 是“對象-關系-映射”的簡稱,主要任務是:
- 根據對象的類型生成表結構。
- 將對象(或對象列表)的操作,轉換為 sql 語句。
- 將 sql 查詢到的結果轉換為對象(或對象列表)。
這極大的減輕了開發人員的工作量,不需要面對因數據庫變更而導致的無效勞動。
Django 中的模型包含了存儲數據的字段和約束,對應著數據庫中唯一的表。
使用 Mysql 數據庫的環境配置
創建數據庫
create databases modeldemo charset=utf8
打開應用的 settings.py 文件,修改 DATABASES 項:
DATABASES = {'default': {'ENGINE': 'django.db.backends.mysql','NAME': 'modeldemo', # 使用的Mysql庫名'USER': '用戶名','PASSWORD': '密碼','HOST': '數據庫服務器ip,本地可以使用localhost','PORT': '端口,默認為3306',}
}
安裝 python mysql API
python3
pip install pymysql
且要在項目的 __init__.py 中添加:
import pymysql
pymysql.version_info = (1, 4, 13, "final", 0) # 指定版本。在出現“mysqlclient 1.4.0 or newer is required; you have 0.9.3.”報錯時加上此行
pymysql.install_as_MySQLdb()
否則會出現報錯:Error loading MySQLdb module: No module named 'MySQLdb'。
python2(已廢棄,基本不用,可以不考慮)
pip install MySQL-python
且不需要在 __init__.py 中添加上述代碼。
開發流程
- 在 models.py 中定義模型類,要求繼承自 models.Model。
- 把應用加入 settings.py 文件的 installed_app 項。
- 遷移:生成遷移文件;執行遷移并生成表(遷移的目的是映射模型類與表。如果模型類與表的映射關系已存在,則無需遷移)。
- 使用模型類進行 crud(增刪改查)操作。
2. 定義模型
在模型中定義屬性,會生成表中的字段。
Django 根據屬性的類型確定以下信息:
- 當前選擇的數據庫支持字段的類型(核心)。
- 渲染管理站點表單時使用的默認 html 控件。
- 在管理站點最低限度的驗證。
Django 會為表增加自動增長的主鍵列,每個模型只能有一個主鍵列,如果使用選項設置某屬性為主鍵列后,則 Django 不會再生成默認的主鍵列。
屬性命名限制:
- 不能是 python 的保留關鍵字。
- 由于 Django 的查詢方式,不允許帶有連續的下劃線。
1)定義屬性
定義屬性時,需要明確字段類型。字段類型被定義在 django.db.models.fields 目錄下,為了方便使用,被導入到了 django.db.models 中。
使用方式:
from django.db import models
通過 models.Field 創建字段類型的對象,賦值給屬性。如:
title = models.CharField(max_length=20)
若想對重要數據都做邏輯刪除而不做物理刪除,實現方法是定義 isDelete 屬性,類型為 BooleanField,默認值為 False。
2)字段類型
- AutoField:一個根據實際 id 自動增長的 IntegerField,通常不指定。
- 如果不指定,一個主鍵字段將自動添加到模型中。
- BooleanField:true/false 字段,此字段的默認表單控制是 CheckboxInput。
- NullBooleanField:支持 null、true、false 三種值。
- CharField(max_length=最大字符長度):字符串,默認的表單樣式是 TextInput。
- TextField:大文本字段,一般超過 4000 字符時使用,默認的表單控件是 Textarea。
- IntegerField:整數。
- DecimalField(max_digits=None, decimal_places=None):使用 python 的 Decimal 實例表示的十進制浮點數。
- DecimalField.max_digits:位數總數。
- DecimalField.decimal_places:小數點后的數字位數。
- FloatField:用 python 的 float 實例來表示的浮點數。
- DateField[auto_now=False, auto_now_add=False]):使用 python 的 datetime.date 實例表示的日期。
- 參數 DateField.auto_now:每次保存對象時,自動設置該字段為當前時間,用于"最后一次修改"的時間戳,它總是使用當前日期,默認為 false。
- 參數 DateField.auto_now_add:當對象第一次被創建時自動設置當前時間,用于創建的時間戳,它總是使用當前日期,默認為 false。
- 該字段默認對應的表單控件是一個 TextInput. 在管理員站點添加了一個 JavaScript 寫的日歷控件,和一個“Today"的快捷按鈕,包含了一個額外的 invalid_date 錯誤消息鍵。
- auto_now_add, auto_now, and default 這些設置是相互排斥的,他們之間的任何組合將會發生錯誤的結果。
- TimeField:使用 python 的 datetime.time 實例表示的時間,參數同 DateField。
- DateTimeField:使用 python 的 datetime.datetime 實例表示的日期和時間,參數同 DateField。
- FileField:一個上傳文件的字段。
- ImageField:繼承了 FileField 的所有屬性和方法,但對上傳的對象進行校驗,確保它是個有效的 image。
3)字段選項
通過字段選項,可以實現對字段的約束。實現方式是通過字段對象的關鍵字參數指定。
- null:如果為 True,Django 將空值以 NULL 存儲到數據庫中,默認值是 False。
- blank:如果為 True,則該字段允許為空白,默認值是 False。
- 對比:null 是數據庫范疇的概念,blank 是表單驗證證范疇的。
- db_column:字段的名