創建 Django 博客的數據庫模型
設計博客的數據庫表結構
博客最主要的功能就是展示文章,它需要從某個地方獲取博客文章數據才能把文章展示出來,通常來說這個地方就是數據庫。把寫好的文章永久地保存在數據庫里,當用戶訪問博客時,Django 就去數據庫里把這些數據取出來展現給用戶。
博客的文章應該含有標題、正文、作者、發表時間等數據。一個更加現代化的博客文章還希望它有分類、標簽、評論等。為了更好地存儲這些數據,需要合理地組織數據庫的表結構。
本例博客初級版本主要包含博客文章,文章會有分類以及標簽。一篇文章只能有一個分類,但可以打上很多標簽。
數據庫存儲的數據其實就是表格的形式,例如存儲博客文章的數據庫表長這個樣子:
id? ? ? ? ?標題? ? ? ? 正文? ? ? ? ?發表時間? ? ? ? ? ?分類? ? ? ? ? ? ? ?標簽
1? ? ? ? ? ?title1? ? ?text1? ? ? ? ?2017-2-23? ? ? ? ?Django? ? ? ? ? 學習
2? ? ? ? ? ?title2? ? ?text2? ? ? ? 2016-3-24? ? ? ? ? Django? ? ? ? ?學習
3? ? ? ? ? ?title3? ? ?text3? ? ? ? ?2016-2-26? ? ? ? ? Python? ? ? Python 學習
其中文章 ID 是一個數字,唯一對應著一篇文章。當然還可以有更多的列以存儲更多相關數據,這只是一個最基本的示例。
數據庫表設計成這樣其實已經可以了,但是稍微分析一下就會發現一個問題,這 3 篇文章的分類和標簽都是相同的,這會產生很多重復數據,當數據量很大時就浪費了存儲空間。
不同的文章可能它們對應的分類或者標簽是相同的,所以我們把分類和標簽提取出來,做成單獨的數據庫表,再把文章和分類、標簽關聯起來。下面分別是分類和標簽的數據庫表:
分類id? ? ? 分類名
1? ? ? ? ? ? ? Django
2? ? ? ? ? ? ? Python
標簽id? ? ? ? ? 標簽名
1? ? ? ? ? ? ? ? ? 學習
2? ? ? ? ? ? ? ?Python 學習
編寫博客模型代碼
以上是自然語言描述的表格,數據庫也和編程語言一樣,有它自己的一套規定的語法來生成上述的表結構,這樣才能把數據存進去。一般來說這時候應該先去學習數據庫創建表格的語法,再回來寫 Django 博客代碼。但是 Django 告訴我們不用這么麻煩,它已經幫我們做了一些事情。Django 把那一套數據庫的語法轉換成了 Python 的語法形式,只要寫 Python 代碼就可以了,Django 會把 Python 代碼翻譯成對應的數據庫操作語言。用更加專業一點的說法,就是 Django 為我們提供了一套 ORM(Object Relational Mapping)系統。
例如分類數據庫表,Django 只要求這樣寫:
Category就是一個標準的 Python 類,它繼承了models.Model類,類名為Category。Category類有一個屬性name,它是models.CharField的一個實例。
這樣,Django 就可以把這個類翻譯成數據庫的操作語言,在數據庫里創建一個名為 category 的表格,這個表格的一個列名為 name,還有一個列 id。Django 則會自動創建。可以看出從 Python 代碼翻譯成數據庫語言時其規則就是一個 Python 類對應一個數據庫表格,類名即表名,類的屬性對應著表格的列,屬性名即列名。
我們需要 3 個表格:文章(Post)、分類(Category)以及標簽(Tag),下面就來分別編寫它們對應的 Python 類: