# 第三節:ORM模型
# ORM模型介紹
隨著項目越來越大,采用寫原生SQL的方式在代碼中會出現大量的SQL語句,那么問題就出現了:
1. SQL語句重復利用率不高,越復雜的SQL語句條件越多,代碼越長。會出現很多相近的SQL語句。
2. 很多SQL語句是在業務邏輯中拼出來的,如果有數據庫需要更改,就要去修改這些邏輯,這會很容易漏掉對某些SQL語句的修改。
3. 寫SQL時容易忽略web安全問題,給未來造成隱患。SQL注入。
`ORM`,全稱`Object Relational Mapping`,中文叫做對象關系映射,通過`ORM`我們可以通過類的方式去操作數據庫,而不用再寫原生的SQL語句。通過把表映射成類,把行作實例,把字段作為屬性,`ORM`在執行對象操作的時候最終還是會把對應的操作轉換為數據庫原生語句。使用`ORM`有許多優點:
1. 易用性:使用`ORM`做數據庫的開發可以有效的減少重復SQL語句的概率,寫出來的模型也更加直觀、清晰。
2. 性能損耗小:`ORM`轉換成底層數據庫操作指令確實會有一些開銷。但從實際的情況來看,這種性能損耗很少(不足5%),只要不是對性能有嚴苛的要求,綜合考慮開發效率、代碼的閱讀性,帶來的好處要遠遠大于性能損耗,而且項目越大作用越明顯。
3. 設計靈活:可以輕松的寫出復雜的查詢。
4. 可移植性:`Django`封裝了底層的數據庫實現,支持多個關系數據庫引擎,包括流行的`MySQL`、`PostgreSQL`和`SQLite`。可以非常輕松的切換數據庫。

## 創建ORM模型:
`ORM`模型一般都是放在`app`的`models.py`文件中。每個`app`都可以擁有自己的模型。并且如果這個模型想要映射到數據庫中,那么這個`app`必須要放在`settings.py`的`INSTALLED_APP`中進行安裝。以下是寫一個簡單的書籍`ORM`模型。示例代碼如下:
```
<pre class="calibre12">```
<span class="hljs-keyword">from</span> django.db <span class="hljs-keyword">import</span> models
<span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">Book</span><span class="hljs-params">(models.Model)</span>:</span>
name = models.CharField(max_length=<span class="hljs-params">20</span>,null=<span class="hljs-keyword">False</span>)
author = models.CharField(max_length=<span class="hljs-params">20</span>,null=<span class="hljs-keyword">False</span>)
pub_time = models.DateTimeField(default=datetime.now)
price = models.FloatField(default=<span class="hljs-params">0</span>)
```
```
以上便定義了一個模型。這個模型繼承自`django.db.models.Model`,如果這個模型想要映射到數據庫中,就必須繼承自這個類。這個模型以后映射到數據庫中,表名是模型名稱的小寫形式,為`book`。在這個表中,有四個字段,一個為`name`,這個字段是保存的是書的名稱,是`varchar`類型,最長不能超過20個字符,并且不能為空。第二個字段是作者名字類型,同樣也是`varchar`類型,長度不能超過20個。第三個是出版時間,數據類型是`datetime`類型,默認是保存這本書籍的時間。第五個是這本書的價格,是浮點類型。
還有一個字段我們沒有寫,就是主鍵`id`,在`django`中,如果一個模型沒有定義主鍵,那么將會自動生成一個自動增長的`int`類型的主鍵,并且這個主鍵的名字就叫做`id`。
## 映射模型到數據庫中:
將`ORM`模型映射到數據庫中,總結起來就是以下幾步:
1. 在`settings.py`中,配置好`DATABASES`,做好數據庫相關的配置。
2. 在`app`中的`models.py`中定義好模型,這個模型必須繼承自`django.db.models`。
3. 將這個`app`添加到`settings.py`的`INSTALLED_APP`中。
4. 在命令行終端,進入到項目所在的路徑,然后執行命令`python manage.py makemigrations`來生成遷移腳本文件。
5. 同樣在命令行中,執行命令`python manage.py migrate`來將遷移腳本文件映射到數據庫中。
- Introduction
- 第一章:學前準備
- 第一節:虛擬環境
- 第二節:準備工作
- 第三節:Django介紹
- 第四節:URL組成部分
- 第二章:URL與視圖
- 第一節:第一個Django項目
- 第二節:視圖與URL分發器
- 第三章:模板
- 第一節:模板介紹
- 第二節:模板變量
- 第三節:常用標簽
- 第四節:常用過濾器
- 第五節:自定義過濾器
- 第七節:模版結構優化
- 第八節:加載靜態文件
- 第四章:數據庫
- 第一節:MySQL相關軟件
- 第二節:數據庫操作
- 第三節:ORM模型
- 第四節:模型常用字段
- 第五節:外鍵和表關系
- 第六節:增刪改查操作
- 第七節:查詢操作
- 第八節:QuerySet API
- 第九節:ORM模型遷移
- 第十節:ORM作業
- 第十一節:ORM作業參考答案
- 第十二節:Pycharm連接數據庫
- 第五章:視圖高級
- 第一節:限制請求method
- 第二節:頁面重定向
- 第三節:HttpRequest對象
- 第四節:HttpResponse對象
- 第五節:生成CSV文件
- 第六節:類視圖
- 第七節:錯誤處理
- 第六章:表單
- 第一節:表單概述
- 第二節:用表單驗證數據
- 第三節:ModelForm
- 第四節:文件上傳
- 第七章:cookie和session
- 第八章:上下文處理器和中間件
- 第一節:上下文處理器
- 第二節:中間件
- 第九章:安全
- 第一節:CSRF攻擊
- 第二節:XSS攻擊
- 第三節:點擊劫持攻擊
- 第四節:SQL注入
- 第十章:信號
- 第一節:什么是信號
- 第十一章:驗證和授權
- 第一節:概述
- 第二節:用戶對象
- 第三節:權限和分組
- 第十二章:Admin系統
- 第十三章:Django的緩存
- 第十四章:memcached
- 第十五章:Redis