創建 django 博客應用
在上一章節中我們創建了 django 博客的工程,并且成功地運行了它。然而這一切都是 django 為我們創建的項目初始內容,django 不可能為我們初始化生成我們需要的博客代碼,這些功能性代碼都得由我們自己編寫。
django 鼓勵我們把自己編寫的代碼組織到應用(Application)里,并且最好是一個應用只提供一個功能。例如我們要開發的 django 博客,相關的代碼都放在博客這個應用里。其實應用沒什么復雜的,不過是把功能相關的代碼放到一個文件夾里,這個文件夾就成了一個應用(姑且可以這樣理解)。我們可以在 django 工程目錄下手動地建立一個文件夾,為它取個名字,并且告訴 django 說這是一個應用。但是我們不必做這些無聊的工作,dango 已經為我們提供了自動創建應用的命令。現在就來創建我們的 django 博客應用,我把它命名為 blog,進入虛擬環境,切換到 manage.py 文件所在的目錄下,運行下面的命令:
前面已經說過,manage.py 是我們的工程管理助手,上一章中我們使用了它的 runserver 命令開啟了一個本地開發服務器,這里我們使用它的 startapp 命令創建了一個 blog 應用。
用資源管理器打開 manage.py 文件所在的目錄,可以看到多了一個名為 blog 的文件夾,它下面的文件結構像這樣:
不同名稱的文件用于存放特定功能的代碼,這些將會在后面詳細介紹。總之這個應用的文件夾結構 django 已經為我們建立好了,但目前它還只是包含各種文件的一個文件夾而已,django 并不知道這是一個應用,我們得告訴 django 這是我們創建的應用,專業一點說就是:在 django 的配置文件中注冊這個應用。打開 blogproject 目錄下的 settings.py 文件,看名字就知道 settings.py 是一個設置文件(setting 意為設置),找到 INSTALLED_APPS 設置項,將 blog 添加進去。?
可以看到 django 已經為我們提供了一些內置的應用,這些應用為我們提供了各種各樣的功能,這就是 django 強大的地方,通用的功能它都幫我們寫好了,我們只需編寫與自身業務相關的功能代碼。
編寫博客的數據庫模型
博客最主要的功能就是展示我們寫的文章,它需要從某個地方獲取我們寫的博客文章數據才能把它展示出來,通常來說這個地方就是數據庫。我們把寫好的文章永久地保存在數據庫里,當用戶訪問我們的博客時,django 就去數據庫里把這些數據取出來展現給用戶。
博客的文章應該含有標題、正文、作者、發表時間等數據,一個更加現代化的博客文章我們也希望它有分類、標簽、評論等。為了更好地存儲這些數據,我們需要合理地組織我們數據庫的結構。
我們的博客初級版本主要包含這些數據:博客文章,文章會有分類以及標簽。一篇文章只能有一個分類,但可以打上很多標簽。數據庫存儲的數據其實就是表格的形式,例如存儲我們的博客文章的數據庫表長這個樣子:
其中 id 是一個數字,唯一對應著一篇文章。當然還可以在列上加入更多的信息,這只是一個最基本的示例。
數據庫表設計成這樣其實已經可以了,但是稍微分析一下我們就會發現一個問題,這 3 篇文章的分類和標簽都是相同的,這會產生很多重復數據,當數據量很大時就浪費了存儲空間。不同的文章可能它們的分類或者標簽是相同的,所以我們把分類和標簽拿出來,做成單獨的數據庫表,再把文章和分類與標簽關聯起來就可以了。下面分別是分類和標簽的數據庫表:
以上是自然語言描述的表格,數據庫也和編程語言一樣,有它自己的一套規定的語法來生成上述的表格結構,這樣我們才能把數據存進去。一般情況下這時候我們應該先去學習數據庫創建表格的語法,再回來寫我們的博客程序了。但是 django 跟我們說不用這么麻煩,我已經幫你做了一些事情,我把那一套數據庫的語法轉換成了 Python 的語法形式,你寫你的 Python 代碼就可以了,翻譯的工作我來幫你。用更加專業一點的說法,就是 django 為我們提供了一套 ORM(Object Relational Mapping)系統。比如說我們的分類數據庫表,django 只要求我們這樣寫:
這就是一個標準的 Python 的類,我們繼承了 models.Model
類,類名為 Category(分類),Category 類有一個屬性 name
,它是 models.CharField
的一個實例。這樣,django 就可以把這個類翻譯成數據庫的語法,在數據庫里創建一個名為 category 的表格,這個表格的一個列名為 name(即分類名),還有一個列 id 則會自動幫我們創建。其規則就是一個 Python 類對應一個數據庫表格,類名即表名,類的屬性對應著表格的列,屬性名即列名。我們需要 3 個表格:文章(Post)、分類(Category)以及標簽(Tag),下面就來創建它們。已經在代碼中做了詳細的注釋,說明每一句代碼的含義。但如果你在移動端下閱讀不便的話,也可以跳到代碼后面看正文的里的講解。
數據庫模型詳解
首先是 Category(分類)和 Tag(標簽)類,它們均繼承自 model.Model
類,這是 django 規定的。它們均有一個 name 屬性,用來存儲它們的名稱。由于分類名和標簽名一般都是用字符串表示,因此我們使用了 CharField
來指定 name
的數據類型,同時 max_length
參數則指定 name
的最大長度。除了 CharField
,django 還為我們提供了更多內置的數據類型,比如時間類型 DateTimeField
、整數類型 IntegerField
等等。在本教程中我們會教你這些類型的使用方法,但以后你開發自己的項目時,你就需要通過閱讀 django 的官方文檔關于字段類型的介紹來了解有哪些數據類型以及如何使用它們。
Post(文章)類也一樣,必須繼承自 model.Model
類。文章的數據庫表稍微復雜一點,主要是列更多。我們為它指定了這些列:






注:這里我們使用了兩種關聯數據庫表的形式,一種是 ForeignKey,它表明一種一對多的關聯。比如這里我們的文章和分類的關系,一篇文章只能對應一個分類,而一個分類下可以有多篇文章。另外一中是 ManyToManyField,看名字就知道這是一種多對多的關聯關系,比如這里的文章和標簽,一篇文章可以有多個標簽,而一個標簽下也可以有多篇文章。假如你對此有一些困惑,強烈建議閱讀官方文檔對這兩種關系的說明以及更多官方的例子以加深理解。