---
# System prepended metadata

title: 'Django 2.0 文章集 [3]建立應用程式'
tags: [python, Django, django2.0]

---

#  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: 功能測試區
