奠定項目基石:Model

環境

虛擬環境+python3.5.2 + Django1.11
安裝虛擬環境的原因是,在實際的項目開發過程中,我們可能需要維護多個項目,甚至同時開發不同的項目,而這些項目的依賴又不同,如果不同的依賴都安裝在系統環境中,可能會出現意想不到的衝突,所以我們創建了可以獨立於系統的Python運行環境和包管理環境,在實際的開發過程中,我們針對不同的項目分別創建獨立的虛擬環境。

Model

Django是基於MVC(Model-View-Controller)模式的框架,其中的M就是Model層。


Model在整個項目中是直接和數據庫打交道的一層,所以數據處理的部分都放在這一層操作,而且這一層也是整個項目的基石,因爲如果數據層出現問題,後面的開發則很難進行下去,或者說沒有意義,所以這一層很重要。
這一層有幾個比較重要的模塊:
Models:模型定義相關的使用說明,需要配置的是字段類型,meta配置等;
QuerySets:在Model的基礎上怎麼查看數據,有哪些接口可以用,以及如何更進一步進行定製;
Model instances:Model的實例,一個實例可以理解爲表中的一條記錄;
Migrations:在開發階段,我們會不斷的調整表的結構,這部分就是用來做表結構的調整的。
Advanced:這裏涉及如何定義Manager(也就是常用的Model.objects.all中的objects),以及如果不爽ORM的查詢限制,但是又想用ORM對象的映射,可以考慮使用原生的SQL。
Other:這一部分有兩塊,一個是Legacy databases(遺留數據庫),想象下,有人甩給你一個已有的CMS項目,要改成Django的,你拿到表,直接根據生成Model。之後你再花幾分鐘寫寫admin部分代碼,CMS出來了,爽不爽。另外一部分就是Optimize database access。

數據關係模型


這個模型是拿到一個項目之後要先進行需求分析,然後從需求中整理而來。而對於內容或者說數據驅動的項目來說,設計好模型是成功的一半,因爲後續的所有操作都是基於Model的。

ORM

ORM(Object Relational Mapping):對象關係映射,大白話解釋就是把我們定義的對象(類)映射到對應的數據庫表上,所以ORM其實就是代碼層面對於數據庫表和關係的一種抽象。
簡單來說,就是繼承了Django的Model,然後定義了對應的字段,Django 會幫我們把Model對應到數據庫的表上,Model中定義的屬性就對應表的一個字段,而對於有關聯關係的Model,比如用到了ForeignKey的Model,就是通過外鍵關聯的表。其中類中的屬性對應數據表的字段,屬性的類型對應MySQL字段的類型,屬性定義時傳遞的參數定義了字段的其他屬性,比如長度,是否允許爲空等。
所以,Model中字段的類型跟MySQL中字段的類型相對應是ORM中基本的規則,我們只需要寫python的代碼,數據庫會根據ORM規則自動生成SQL語言,避免了複雜的SQL語句的書寫。

QuerySet的使用

在Model中,QuerySet是一個很重要的概念。因爲我們同數據庫的所有查詢以及更新交互都是通過它來完成的。
在Model層中,Django通過給Model增加一個objects屬性來提供數據操作的藉口,當我們用到它時,他會去DB中獲取數據。爲什麼是當我們用到它時

# 第一句是不會取數據庫中提取數據的,他只會生成一個object對象
posts = Post.objects.all()
# 當真正用到它的時候,纔會去數據庫中拿數據
available_posts = posts.filter(status=1)

其原因是QuerySet支持鏈式操作,如果每次執行都要查詢數據庫的話,會存在性能問題。
同時,QuerySet還提供了很多供我們使用的接口,用來查詢數據,如all,filter等。
也就是說,Django 的ORM爲了達到跟SQL語句同樣的表達能力,給我們提供了各種各樣的接口。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章