--- title: topics tags: learning notes, Django --- [toc] # Models and databases ## Models Model 是你的資料中,單一、明確的資料來源,包含兩個要素,(一或多個)根本的 field &被你儲存的資料的 behavior。一個 model 映射一個 table * 三個基本 - 每個 model 都是 django.db.models.Model 的子類別 - model 的每個屬性都代表著一個資料庫的 field,屬性映射到 table column - 所以 Django 才能有自動生成,存取資料庫的 API ### Using models model 定義完成後,必須在專案 `setting.py` 設定 `INSTALLED_APPS`, model 才能被使用 ### Fields * Django用型別 (類別 Field)來決定: - column 的型別 (`INTEGER`, `VARCHAR`, `TEXT`) - form field 中,預設 HTML 輸入型別 (`<input type="text">`, `<select>`) - 小型驗證需求 (如 admin 或自動生成的 form) ### Meta options 用內部類別 Meta 把 metadata 提供給 model > Model metadata is “anything that’s not a field” ### Model attributes model 最重要的屬性就是 Manager,它是 model 查詢資料庫和從資料庫取回實例的接口 (interface) ### Model methods 定義特製方法來操作物件,特製 table 中的 row ### Model inheritance * 在 Django 可能有三種繼承方式: - 母類別擁有共同資訊,並繼承給子 models - 繼承現存的 model,model 和子 model 都要有自己的 table - 只是想要修改 model python-level 的行為,沒有要更動 field ### Organizing models in a package 太多 model 的時候,建議組織成套件 ## Making queries 當 model 創建好時,就能自動使用 Django 的 API 來創造、取回、更新、刪除物件 一個 model 就代表一個資料庫 table,一個類別的實例就代表 table 裡的紀錄 ### Creating objects 用關鍵字引數 (kwarg) 來實例化,指派給變數儲存 (`variable.save()`) 背後使用 SQL INSERT ### Save changes to objects 將新的數據值指派給變數(`variable.kw = `) 背後使用 SQL UPDATE ### Retrieving objects 在類別 model 中透過類別 Manager 建構 QuerySet,才能將物件自資料庫取回 一個 Queryset 代表在資料庫中多個物件的集合, Queryset 可以擁有零到多個 filter, filter 依照參數篩選查詢結果 背後使用 SQL SELECT 表 Queryset,WHERE or LIMIT 表 filter ### Deleting objects # Handling HTTP requests ## URL dispatcher ### Overview 利用創建的 Python 模組 URLconf(URL configuration)來設計應用程式的 URL,這個模組映射 URL 路徑表達到 views 中的 Python 函式 ### How Django processes a request server 收到 request 時執行的演算法: 1. Django 決定要使用的 ROOT_URLCONF 2. Django 讀取 Python 模組,並尋找變數的 urlpatterns 3. Django 按順序查找 URL 模式,找到第一個匹配的 URL 模式便停止 4. Django 找到 URL 模式後,匯入並呼叫給定的 view (一個 function 或 class-based view),讓 view 得到下列引數 - 一個 HttpRequest 的實例 - If the matched URL pattern returned no named groups, then the matches from the regular expression are provided as positional arguments. - 5. 若 URL 匹配失敗或是發生例外, Django 使用 error-handling view ### Path converters str, int, slug, uuid, path ## Writing views view function 是 Python function 接收 request 後回傳 response,response 可以是 HTML, redirect, 404 error, XML document, image 等等任何東西 ### Returning errors 使用 HttpResponse 的子類別來回傳 HTTP 的狀態碼 ## View decorators Django 提供很多運用在 view 來支援 HTTP 的 decorator ### Allowed HTTP methods 用 decorator 決定管制的 HTTP request method ### Conditional viewing processing ## File uploads ### Basic file uploads ## Django shortcut functions 為了方便 * render(request, template_name) 結合給定的 template 和 context dictionary ,回傳 HttpResponse 物件 * redirect() * get_object_or_404() * get_list_or_404() # Template 一個 template 包含靜態的 HTML 輸出以及能夠讓動態內容插入的特殊語法 Django 的 template 系統有內建後端,稱為 Django template language (DTL),也有熱門的 jinja2 Django 定義了 API 來讀取和回覆 template,而不是用後端 讀取 (loading):尋找給定 identifier 的 template 並預處理及編譯 回覆 (rendering):將資料插入 template 並回傳結果字串 ## Supports for template engines ### Configuration Template engines 被配置在 TEMPLATE 中 * 'BACKEND' - django.template.backends.django.DjangoTemplates - django.template.backends.jinja2.Jinja2 * 'DIR' 定義 engine 尋找 template 來源檔的目錄清單 ### Usage * django.template.loader 模組定義下列函式來讀取模組 - get_template() 讀取 template 並回傳 template object - select_template() 讓 template 讀取更有彈性 - render_to_string() 同時 load 和 render 的 shortcut * 如果 template 讀取失敗,django.template.exceptions 舉出例外 ## The Django template language (DTL) ### Syntax DTL 語法涉及4個構想: 1. Variables Variables are surrounded by {{ and }} 2. Tags Tags 在回覆 (render) 過程中提供任意邏輯 Tags are surrounded by {% and %} 3. Filters 轉換 variables 的值或 tags 的引數 look like {{ django|title }} or {{ my_date|date:"Y-m-d" }} 4. Comments look like {# this won't be rendered #} ### Components # Migrations 在 model 中所做的改作,透過 migration 更新資料庫的大綱 ## The commands 將 migrations 想成資料庫大綱的版本控制系統 * migrate 啟用 model * makemigrations 像版控的 commit,將 models 打包成 migration 檔案 * sqlmigrate * showmigrations ## Workflow 先 commit(makemigrations) 再 apply(migrate) * class-based views 將 views 實作成 python object,與 function-based views 比較會有下列優點: - 組織關於 HTTP 方法的程式時(如GET, POST, etc.),可以直接針對那個方法,不用繁瑣的使用條件式(conditional branching) - 運用物件導向中 mixins(multiple inheritance) 的技巧,將程式碼重塑成可以重新使用的(reuseable)部件 * generic views, class-based views, class-based generic views 的歷史與關係 - 代補 *