Django快速搭建博客(三)

創(chuàng)建 Django 博客的數(shù)據(jù)庫(kù)模型

設(shè)計(jì)博客的數(shù)據(jù)庫(kù)表結(jié)構(gòu)

博客最主要的功能就是展示文章,它需要從某個(gè)地方獲取博客文章數(shù)據(jù)才能把文章展示出來(lái),通常來(lái)說(shuō)這個(gè)地方就是數(shù)據(jù)庫(kù)。把寫好的文章永久地保存在數(shù)據(jù)庫(kù)里,當(dāng)用戶訪問(wèn)博客時(shí),Django 就去數(shù)據(jù)庫(kù)里把這些數(shù)據(jù)取出來(lái)展現(xiàn)給用戶。

博客的文章應(yīng)該含有標(biāo)題、正文、作者、發(fā)表時(shí)間等數(shù)據(jù)。一個(gè)更加現(xiàn)代化的博客文章還希望它有分類、標(biāo)簽、評(píng)論等。為了更好地存儲(chǔ)這些數(shù)據(jù),需要合理地組織數(shù)據(jù)庫(kù)的表結(jié)構(gòu)。

本例博客初級(jí)版本主要包含博客文章,文章會(huì)有分類以及標(biāo)簽。一篇文章只能有一個(gè)分類,但可以打上很多標(biāo)簽。

數(shù)據(jù)庫(kù)存儲(chǔ)的數(shù)據(jù)其實(shí)就是表格的形式,例如存儲(chǔ)博客文章的數(shù)據(jù)庫(kù)表長(zhǎng)這個(gè)樣子:

id? ? ? ? ?標(biāo)題? ? ? ? 正文? ? ? ? ?發(fā)表時(shí)間? ? ? ? ? ?分類? ? ? ? ? ? ? ?標(biāo)簽

1? ? ? ? ? ?title1? ? ?text1? ? ? ? ?2017-2-23? ? ? ? ?Django? ? ? ? ? 學(xué)習(xí)

2? ? ? ? ? ?title2? ? ?text2? ? ? ? 2016-3-24? ? ? ? ? Django? ? ? ? ?學(xué)習(xí)

3? ? ? ? ? ?title3? ? ?text3? ? ? ? ?2016-2-26? ? ? ? ? Python? ? ? Python 學(xué)習(xí)


其中文章 ID 是一個(gè)數(shù)字,唯一對(duì)應(yīng)著一篇文章。當(dāng)然還可以有更多的列以存儲(chǔ)更多相關(guān)數(shù)據(jù),這只是一個(gè)最基本的示例。

數(shù)據(jù)庫(kù)表設(shè)計(jì)成這樣其實(shí)已經(jīng)可以了,但是稍微分析一下就會(huì)發(fā)現(xiàn)一個(gè)問(wèn)題,這 3 篇文章的分類和標(biāo)簽都是相同的,這會(huì)產(chǎn)生很多重復(fù)數(shù)據(jù),當(dāng)數(shù)據(jù)量很大時(shí)就浪費(fèi)了存儲(chǔ)空間。

不同的文章可能它們對(duì)應(yīng)的分類或者標(biāo)簽是相同的,所以我們把分類和標(biāo)簽提取出來(lái),做成單獨(dú)的數(shù)據(jù)庫(kù)表,再把文章和分類、標(biāo)簽關(guān)聯(lián)起來(lái)。下面分別是分類和標(biāo)簽的數(shù)據(jù)庫(kù)表:

分類id? ? ? 分類名

1? ? ? ? ? ? ? Django

2? ? ? ? ? ? ? Python

標(biāo)簽id? ? ? ? ? 標(biāo)簽名

1? ? ? ? ? ? ? ? ? 學(xué)習(xí)

2? ? ? ? ? ? ? ?Python 學(xué)習(xí)

編寫博客模型代碼

以上是自然語(yǔ)言描述的表格,數(shù)據(jù)庫(kù)也和編程語(yǔ)言一樣,有它自己的一套規(guī)定的語(yǔ)法來(lái)生成上述的表結(jié)構(gòu),這樣才能把數(shù)據(jù)存進(jìn)去。一般來(lái)說(shuō)這時(shí)候應(yīng)該先去學(xué)習(xí)數(shù)據(jù)庫(kù)創(chuàng)建表格的語(yǔ)法,再回來(lái)寫 Django 博客代碼。但是 Django 告訴我們不用這么麻煩,它已經(jīng)幫我們做了一些事情。Django 把那一套數(shù)據(jù)庫(kù)的語(yǔ)法轉(zhuǎn)換成了 Python 的語(yǔ)法形式,只要寫 Python 代碼就可以了,Django 會(huì)把 Python 代碼翻譯成對(duì)應(yīng)的數(shù)據(jù)庫(kù)操作語(yǔ)言。用更加專業(yè)一點(diǎn)的說(shuō)法,就是 Django 為我們提供了一套 ORM(Object Relational Mapping)系統(tǒng)。

例如分類數(shù)據(jù)庫(kù)表,Django 只要求這樣寫:


Category就是一個(gè)標(biāo)準(zhǔn)的 Python 類,它繼承了models.Model類,類名為Category。Category類有一個(gè)屬性name,它是models.CharField的一個(gè)實(shí)例。

這樣,Django 就可以把這個(gè)類翻譯成數(shù)據(jù)庫(kù)的操作語(yǔ)言,在數(shù)據(jù)庫(kù)里創(chuàng)建一個(gè)名為 category 的表格,這個(gè)表格的一個(gè)列名為 name,還有一個(gè)列 id。Django 則會(huì)自動(dòng)創(chuàng)建??梢钥闯鰪?Python 代碼翻譯成數(shù)據(jù)庫(kù)語(yǔ)言時(shí)其規(guī)則就是一個(gè) Python 類對(duì)應(yīng)一個(gè)數(shù)據(jù)庫(kù)表格,類名即表名,類的屬性對(duì)應(yīng)著表格的列,屬性名即列名。

我們需要 3 個(gè)表格:文章(Post)、分類(Category)以及標(biāo)簽(Tag),下面就來(lái)分別編寫它們對(duì)應(yīng)的 Python 類:


最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容