環(huán)境
虛擬環(huán)境+python3.5.2 + Django1.11
安裝虛擬環(huán)境的原因是邪乍,在實際的項目開發(fā)過程中,我們可能需要維護多個項目产弹,甚至同時開發(fā)不同的項目剑勾,而這些項目的依賴又不同,如果不同的依賴都安裝在系統(tǒng)環(huán)境中朗涩,可能會出現(xiàn)意想不到的沖突忽孽,所以我們創(chuàng)建了可以獨立于系統(tǒng)的Python運行環(huán)境和包管理環(huán)境,在實際的開發(fā)過程中谢床,我們針對不同的項目分別創(chuàng)建獨立的虛擬環(huán)境兄一。
Model
Django是基于MVC(Model-View-Controller)模式的框架,其中的M就是Model層识腿。
Model在整個項目中是直接和數(shù)據(jù)庫打交道的一層出革,所以數(shù)據(jù)處理的部分都放在這一層操作,而且這一層也是整個項目的基石渡讼,因為如果數(shù)據(jù)層出現(xiàn)問題骂束,后面的開發(fā)則很難進行下去,或者說沒有意義成箫,所以這一層很重要展箱。
這一層有幾個比較重要的模塊:
Models:模型定義相關(guān)的使用說明,需要配置的是字段類型蹬昌,meta配置等混驰;
QuerySets:在Model的基礎(chǔ)上怎么查看數(shù)據(jù),有哪些接口可以用皂贩,以及如何更進一步進行定制栖榨;
Model instances:Model的實例,一個實例可以理解為表中的一條記錄明刷;
Migrations:在開發(fā)階段婴栽,我們會不斷的調(diào)整表的結(jié)構(gòu),這部分就是用來做表結(jié)構(gòu)的調(diào)整的辈末。
Advanced:這里涉及如何定義Manager(也就是常用的Model.objects.all中的objects)愚争,以及如果不爽ORM的查詢限制映皆,但是又想用ORM對象的映射,可以考慮使用原生的SQL准脂。
Other:這一部分有兩塊劫扒,一個是Legacy databases(遺留數(shù)據(jù)庫),想象下狸膏,有人甩給你一個已有的CMS項目沟饥,要改成Django的,你拿到表湾戳,直接根據(jù)生成Model贤旷。之后你再花幾分鐘寫寫admin部分代碼,CMS出來了砾脑,爽不爽幼驶。另外一部分就是Optimize database access。
數(shù)據(jù)關(guān)系模型
這個模型是拿到一個項目之后要先進行需求分析韧衣,然后從需求中整理而來盅藻。而對于內(nèi)容或者說數(shù)據(jù)驅(qū)動的項目來說,設(shè)計好模型是成功的一半畅铭,因為后續(xù)的所有操作都是基于Model的氏淑。
ORM
ORM(Object Relational Mapping):對象關(guān)系映射,大白話解釋就是把我們定義的對象(類)映射到對應(yīng)的數(shù)據(jù)庫表上硕噩,所以O(shè)RM其實就是代碼層面對于數(shù)據(jù)庫表和關(guān)系的一種抽象假残。
簡單來說,就是繼承了Django的Model炉擅,然后定義了對應(yīng)的字段辉懒,Django 會幫我們把Model對應(yīng)到數(shù)據(jù)庫的表上,Model中定義的屬性就對應(yīng)表的一個字段谍失,而對于有關(guān)聯(lián)關(guān)系的Model眶俩,比如用到了ForeignKey的Model,就是通過外鍵關(guān)聯(lián)的表快鱼。其中類中的屬性對應(yīng)數(shù)據(jù)表的字段仿便,屬性的類型對應(yīng)MySQL字段的類型,屬性定義時傳遞的參數(shù)定義了字段的其他屬性攒巍,比如長度,是否允許為空等荒勇。
所以柒莉,Model中字段的類型跟MySQL中字段的類型相對應(yīng)是ORM中基本的規(guī)則,我們只需要寫python的代碼沽翔,數(shù)據(jù)庫會根據(jù)ORM規(guī)則自動生成SQL語言兢孝,避免了復(fù)雜的SQL語句的書寫窿凤。
QuerySet的使用
在Model中,QuerySet是一個很重要的概念跨蟹。因為我們同數(shù)據(jù)庫的所有查詢以及更新交互都是通過它來完成的雳殊。
在Model層中,Django通過給Model增加一個objects屬性來提供數(shù)據(jù)操作的借口窗轩,當(dāng)我們用到它時夯秃,他會去DB中獲取數(shù)據(jù)。為什么是當(dāng)我們用到它時痢艺?
# 第一句是不會取數(shù)據(jù)庫中提取數(shù)據(jù)的仓洼,他只會生成一個object對象
posts = Post.objects.all()
# 當(dāng)真正用到它的時候,才會去數(shù)據(jù)庫中拿數(shù)據(jù)
available_posts = posts.filter(status=1)
其原因是QuerySet支持鏈式操作堤舒,如果每次執(zhí)行都要查詢數(shù)據(jù)庫的話色建,會存在性能問題。
同時舌缤,QuerySet還提供了很多供我們使用的接口箕戳,用來查詢數(shù)據(jù),如all国撵,filter等陵吸。
也就是說,Django 的ORM為了達到跟SQL語句同樣的表達能力卸留,給我們提供了各種各樣的接口走越。