該系列教程系個人原創,並完整發布在個人官網劉江的博客和教程
所有轉載本文者,需在頂部顯著位置注明原作者及www.liujiangblog.com官網地址。
題外話:
Django的教程寫到這里,就進入了整體的第二部分,也是最關鍵的部分。此時有一個問題必須想清楚,那就是,以項目帶動內容還是以參考書目的方式展開?為此,我考慮了很久。
我在開始學習Django的時候,也看過許多教程和博客,有的專述某個細節,雖然比較深入,但不夠全面;有的比較泛泛但不夠深入。有的以項目帶動,簡單易懂,可以跟着一步步做,但做完了,只學到作者的幾個小技巧,對Django仍然是一知半解。都知道用Django的ORM可以方便的操作數據庫,但你知道Django有幾種數據庫API么?都知道模板過濾器很有幫助,但你都用過么,是不是只會大小寫轉換?
項目實戰當然重要,但是全面完善的內容介紹能給你更多的幫助。參考書式的講解,可能比較晦澀,但絕對是你入門之后,最好的幫手,我們可以時不時,在需要的情況下,回頭再翻翻,然后恍然大悟,原來Django本身就有這個功能,根本不需要自己實現。畢竟我們學習Django不是學習如何開發Web框架,而是學習Web框架本身提供給你的功能,如果連Django提供的現成功能都不能夠了解齊全,還談什么二次開發?
當然,項目實戰也必須有,但這就是教程的第三部分內容了。
基調已定,那么為了保證內容的全面、准確和權威性,本部分內容以Django官方文檔為依據,加以適當調整和修飾。
以上!!
回到我們的主題--模型層。
在MVC或者說MTV設計模式中,模型(M)代表對數據庫的操作。那么如何操作數據庫呢?
手動切換到數據庫環境,然后敲入SQL語句?你知道這是個笑話!
我們是程序員,講的是自動化,實現的是Python環境下的操作,所以我們必然是通過寫Python代碼的方式。可是....Python和數據庫語言SQL是兩碼事啊,它根本操作不了數據庫!沒關系,我們可以在Python代碼中嵌入SQL語句,比如下面的方式:
# 創建連接,這里先忽略創建方法
conn = ......
# 創建游標
cursor = conn.cursor()
# 執行SQL,並返回收影響行數
effect_row = cursor.execute("insert into host (hostname,port,ip) values('ubuntu','22','10.0.0.2');")
# 提交,不然無法保存新建或者修改的數據
conn.commit()
# 關閉游標
cursor.close()
# 關閉連接
conn.close()
但是問題又來了,Python怎么創建和數據庫的連接呢?或者更直白的說Python怎么連接數據庫呢?可以使用類似pymysql這一類的第三方模塊(針對不同的數據庫,有不同的模塊)。於是我們可以進行如下的連接:
conn = pymysql.connect(host='137.78.5.130', port=3306, user='root', passwd='123456', db='test')
好了,這樣似乎就Ok了。但是,如果你有很多的數據庫操作,並且你的Python程序員不是專業的DBA,寫的SQL語句很爛,甚至經常寫錯,怎么辦?
聰明的人想出了一個辦法:用Python語法來寫,然后使用一個中間工具將Python代碼翻譯成原生的SQL語句,這樣你總不會寫錯了吧?這個中間工具就是所謂的ORM(對象關系映射)!
ORM將一個Python的對象映射為數據庫中的一張關系表。它將SQL封裝起來,程序員不再需要關心數據庫的具體操作,只需要專注於自己本身代碼和業務邏輯的實現。
於是,整體的實現過程就是:Python代碼,通過ORM轉換成SQL語句,再通過pymysql去實際操作數據庫。
最典型的ORM就是SQLAlchemy了,如果你的Web框架自身不帶ORM系統,那么你可以安裝使用它,SQLAlchemy使用者還是比較多的,本身功能也比較強大,大家可以自行學習。
Django自帶ORM系統,不需要額外安裝別的ORM。當然,也可以安裝並使用其它的ORM,比如SQLAlchemy,但是不建議這么做,因為Django系統龐大,集成完善,模型層與視圖層、模板層結合得比較緊密,使用自帶的ORM更方便更可靠,並且Django自帶的ORM功能也非常強大,也不難學。
Django的ORM系統體現在框架內就是模型層。想要理解模型層的概念,關鍵在於理解用Python代碼的方式來定義數據庫表的做法!一個Python的類,就是一個模型,代表數據庫中的一張數據表!Django奉行Python優先的原則,一切基於Python代碼的交流,完全封裝SQL內部細節。