【前置課程】你的第一個Django View
-
【5分鐘】ORM概念理解
對象關系映射(英語:(Object Relational Mapping,簡稱ORM,或O/RM,或O/R mapping),是一種程序技術,用于實現面向對象編程語言里不同類型系統的數據之間的轉換。
它的作用是在關系型數據庫和業務實體對象之間作一個映射,這樣,我們在具體的操作業務對象的時候,就不需要再去和復雜的SQL語句打交道,只需簡單的操作對象的屬性和方法。
優點:擺脫復雜的SQL操作,適應快速開發;不需要開發一個專用的、龐大的數據訪問層;讓數據結構變得簡潔;數據庫遷移成本更低(如從mysql->oracle);
缺點:犧牲程序的執行效率和會固定思維模式;ORM是一種完全的面向對象的做法,而面向對象的做法也會對性能產生一定的影響;復雜的SQL操作還需通過SQL語句實現;
對象-關系映射(ORM),是隨著面向對象的軟件開發方法發展而產生的。用來把對象模型表示的對象映射到基于S Q L 的關系模型數據庫結構中去。這樣,我們在具體的操作實體對象的時候,就不需要再去和復雜的 SQ L 語句打交道,只需簡單的操作實體對象的屬性和方法。O R M 技術是在對象和關系之間提供了一條橋梁,前臺的對象型數據和數據庫中的關系型的數據通過這個橋梁來相互轉化。
-
一般的ORM包括以下四部分:
- 一個對持久類對象進行CRUD操作的API;
- 一個語言或API用來規定與類和類屬性相關的查詢;
- 一個規定mapping metadata的工具;
- 一種技術可以讓ORM的實現同事務對象一起進行dirty checking, lazy association fetching以及其他的優化操作。
講解:舉幾個簡單的例子說明,這部分關鍵是概念上的理解。這部分內容會幫助理解后續代碼實現。
-
【10分鐘】創建調查用戶信息的Model
- 根據業務需求創建名為【UserInfo】的Model;一旦定義了Model,就要告訴django你需要使用它們;
- 注意:【UserInfo】是【investigate】中的一個Model。一個App可以擁有多個像【UserInfo】這樣的Model。
- 為【UserInfo】創建字段(Fields),字段的類型將告訴數據庫存儲的數據類型(比如:INTEGER,VARCHAR,TEXT,DATETIME)
INSTALLED_APPS = [
#...
'investigate',
#...]
- 常用的字段類型清單
名稱 | 說明 |
---|---|
AutoField | 一個自動遞增的整型字段,添加記錄時它會自動增長。你通常不需要直接使用這個字段;如果你不指定主鍵的話,系統會自動添加一個主鍵字段到你的model。(參閱自動主鍵字段) |
BooleanField | 布爾字段,管理工具里會自動將其描述為checkbox。 |
CharField | 字符串字段,單行輸入,用于較短的字符串,如要保存大量文本, 使用 TextField;CharField有一個必填參數:CharField.max_length:字符的最大長度,django會根據這個參數在數據庫層和校驗層限制該字段所允許的最大字符數。 |
TextField | 一個容量很大的文本字段, admin 管理界面用 <textarea>多行編輯框表示該字段數據。 |
CommaSeparatedIntegerField | 用于存放逗號分隔的整數值。類似 CharField,必須maxlength 參數。 |
DateField | 日期字段 |
DateTimeField | 類似 DateField 支持同樣的附加選項。 |
EmailField | 一個帶有檢查 Email 合法性的 CharField,不接受 maxlength 參數。 |
FileField | 一個文件上傳字段。 要求一個必須有的參數: upload_to, 一個用于保存上載文件的本地文件系統路徑。 |
FilePathField | 選擇指定目錄按限制規則選擇文件,有三個參數可選, 其中”path”必需的,這三個參數可以同時使用 |
FloatField | 浮點型字段。 必須提供兩個 參數, 參數描述:max_digits:總位數(不包括小數點和符號) decimal_places:小數位數。如:要保存最大值為 999 (小數點后保存2位),你要這樣定義字段:models.FloatField(…,max_digits=5, decimal_places=2),要保存最大值一百萬(小數點后保存10位)的話,你要這樣定義:models.FloatField(…,max_digits=19, decimal_places=10) |
ImageField | 類似 FileField, 不過要校驗上傳對象是否是一個合法圖片。它有兩個可選參數:height_field 和 width_field,如果提供這兩個參數,則圖片將按提供的高度和寬度規格保存。 該字段要求 Python Imaging 庫。 |
IntegerField | 用于保存一個整數。 |
IPAddressField | 一個字符串形式的 IP 地址, (如 “202.1241.30″)。 |
NullBooleanField | 類似 BooleanField, 不過允許 NULL 作為其中一個選項。 推薦使用這個字段而不要用 BooleanField 加 null=True 選項。 admin 用一個選擇框 <select> (三個可選擇的值: “Unknown”, “Yes” 和 “No” ) 來表示這種字段數據。 |
PhoneNumberField | 一個帶有合法美國風格電話號碼校驗的 CharField(格式:XXX-XXX-XXXX)。 |
PositiveIntegerField | 類似 IntegerField, 但取值范圍為非負整數(這個字段應該是允許0值的…可以理解為無符號整數) |
PositiveSmallIntegerField | 正小整型字段,類似 PositiveIntegerField, 取值范圍較小 |
SlugField | 是一個報紙術語. slug 是某個東西的小小標記(短簽), 只包含字母,數字,下劃線和連字符.它們通常用于URLs。 |
SmallIntegerField | 類似 IntegerField, 不過只允許某個取值范圍內的整數。(依賴數據庫) |
TimeField | 時間字段,類似于 DateField 和 DateTimeField。 |
URLField | 用于保存 URL。 若 verify_exists 參數為 True (默認), 給定的 URL 會預先檢查是否存在(即URL是否被有效裝入且沒有返回404響應)。 |
USStateField | 美國州名縮寫,由兩個字母組成。 |
XMLField | XML字符字段,校驗值是否為合法XML的 TextField,必須提供參數:schema_path:校驗文本的 RelaxNG schema 的文件系統路徑。 |
附:Field 選項
選項 | 說明 |
---|---|
null | 缺省設置為false.通常不將其用于字符型字段上,比如CharField,TextField上.字符型字段如果沒有值會返回空字符串。 |
blank | 該字段是否可以為空。如果為假,則必須有值 |
choices | 一個用來選擇值的2維元組。第一個值是實際存儲的值,第二個用來方便進行選擇。如SEX_CHOICES= ((‘F’,'Female’),(‘M’,'Male’),) |
core | db_column,db_index 如果為真將為此字段創建索引 |
default | 設定缺省值 |
editable | 如果為假,admin模式下將不能改寫。缺省為真 |
help_text | admin模式下幫助文檔 |
primary_key | 設置主鍵,如果沒有設置django創建表時會自動加上ID作為主鍵 |
radio_admin | 用于admin模式下將select轉換為radio顯示。只用于ForeignKey或者設置了choices |
unique | 數據唯一 |
unique_for_date | 日期唯一,如下例中系統將不允許title和pub_date兩個都相同的數據重復出現 title = meta.CharField(maxlength=30,unique_for_date=’pub_date’) |
unique_for_month / unique_for_year | 用法同上 |
validator_list | 有效性檢查。非有效產生 django.core.validators.ValidationError 錯誤 |
- 【UserInfo】當中的部分Fileds示例代碼
js_id = models.CharField(max_length=100, verbose_name=u"簡書id")
age = models.IntegerField(verbose_name=u"年齡")
time = models.DateTimeField(default=timezone.now, verbose_name=u"時間")