# Django 2.0 文章集 [3]建立應用程式 ###### tags: `Django`, `django2.0`, `python` ## 建立應用程式 python manage.py startapp blog ## 修改 mysite/blog/models.py: 定義 ORM (模型類) 1) models.CharField => Relational-DB(SQL DB)下轉成 VARCHAR 型別 2) slug (型別類似String) => 用於 URL,作為一種簡短的標記 根據 slug 可以建立比較直觀、SEO友善的 URL。 3) author => 外來鍵 (Author:Post is 1:N) from django.contrib.auth.models import User author = models.ForeignKey(User, on_delete=models.CASCADE, related_name="blog_posts") => 借助 Django 驗證系統的 User 模型類, on_delete 參數: 闡明當該模型類的實體被刪除時,要做的動作 on_delete=models.CASCADE: 非 Django 準則,而是 SQL 規範。 舉例如: 當某位 author(父類)被刪除, 所有"外來鍵為該 author"的所有 Post 實體(子類)    (這位author寫的所有貼文) 都將被一併刪除。 => 這邊以 .ForeignKey 從子類 post(N) 對應回父類 author(1) 未來會介紹 related_name 可將父類 author(1) 對應到子類 post(N) 4) models.TextField => Relational-DB(SQL DB)下轉成 TEXT 型別 適合需要放置大量文字的欄位,如此處(Post 模型類)的 body(內文) 5) publish = models.DateTimeField(default=timezone.now) => 文章發布日期。(預設:回傳python的datetime.now) 6) created = models.DateTimeField(auto_now_add=True) updated = models.DateTimeField(auto_now=True) (i) created => 貼文建立時間 auto_now_add 參數: 當初次建立某個實體時 該欄位(created)將自動儲存 (ii) updated => 貼文最後一次更新時間 auto_now 參數: 當儲存某個實體時,該欄位(updated)將自動儲存 7) status => 貼文狀態(借助 python tuple: STATUS_CHOICES) 此處定義 draft 為草稿;published 為已發佈貼文 8) class Meta: ordering = ("-publish",) => (i) 模型類內含類別 'Meta': 包含元數據 (ii) ordering 指定查詢元數據時排序方式 (iii) ordering = ("-publish",) 指定查詢元數據時依 publish欄位 遞減排序 (前綴"-" <=> SQL:DESC) 9) def __str__(self): return self.title 印出模型類時,預設印出 title 欄位值。 (<=> Java 的 @Override print() | 即: 預設印出該class時的回傳值) ## 修改 mysite/mysite/settings.py ### 註冊應用程序:blog 到 INSTALLED_APPS 加上一行 'blog.apps.BlogConfig' BlogConfig 定義應用程式的配置內容,加入 INSTALLED_APPS 可使 Django 辨識該應用程式已啟用,並加載模型類。 ### 更新遷移 (生成遷移文件) P.S. 專案建立之初,已用 "python manage.py migrate" 對初始 INSTALLED_APPS 設定遷移。 因為跟初始建立遷移相比,現在已對 blog/models.py 做修改 故此處需要先更新(生成)遷移文件。 P.S. "遷移文件" 即:之後的"遷移"動作所需要用到的 ORM (模型類)變化內容記錄檔。 => python manage.py makemigrations blog (其中 blog 為我們註冊的應用程式名) ### 遷移 (利用上述步驟生成的遷移文件) => python manage.py migrate P.S. 每當修改 mysite/blog/models.py (某應用程式的 ORM) 後, 需先 (1) 生成遷移文件: 以讓 Django、開發者自己 追蹤 ORM 的變化 (2) 遷移: 以讓 ORM 和 DB (預設為 SQLite) 保持同步 ### (補充) 查看 Django 實際在資料庫執行 (遷移文件生成) 的 SQL語法 P.S. 不會執行SQL,僅回傳以供檢視 python manage.py sqlmigrate blog 0001 ## mysite/blog 下目錄解說 1) views.py: "視圖",放置應用程式邏輯。 每個視圖接收一個 HTTP request, 經處理後返回一個 response。 2) models.py: 放置資料模型類(ORM),可為空。 即: 以 python 語法 & Django框架寫法 定義每個需要用到的 table。 (可直接操作 ORM 進行 CRUD,而不牽涉 SQL 當 DB 抽換時可省去更改 SQL語法的麻煩) 3) migrations目錄: 4) __init__.py: 告知 python 將 /blog 資料夾當作一個模組 5) admin.py: Django 管理站點 6) apps.py: 主配置內容 7) test.py: 功能測試區