Django 博客教程(三):創建應用和編寫數據庫模型

創建 django 博客應用

在上一章節中我們創建了 django 博客的工程,并且成功地運行了它。然而這一切都是 django 為我們創建的項目初始內容,django 不可能為我們初始化生成我們需要的博客代碼,這些功能性代碼都得由我們自己編寫。

django 鼓勵我們把自己編寫的代碼組織到應用(Application)里,并且最好是一個應用只提供一個功能。例如我們要開發的 django 博客,相關的代碼都放在博客這個應用里。其實應用沒什么復雜的,不過是把功能相關的代碼放到一個文件夾里,這個文件夾就成了一個應用(姑且可以這樣理解)。我們可以在 django 工程目錄下手動地建立一個文件夾,為它取個名字,并且告訴 django 說這是一個應用。但是我們不必做這些無聊的工作,dango 已經為我們提供了自動創建應用的命令。現在就來創建我們的 django 博客應用,我把它命名為 blog,進入虛擬環境,切換到 manage.py 文件所在的目錄下,運行下面的命令:

640?wx_fmt=png&tp=webp&wxfrom=5&wx_lazy=

前面已經說過,manage.py 是我們的工程管理助手,上一章中我們使用了它的 runserver 命令開啟了一個本地開發服務器,這里我們使用它的 startapp 命令創建了一個 blog 應用。

用資源管理器打開 manage.py 文件所在的目錄,可以看到多了一個名為 blog 的文件夾,它下面的文件結構像這樣:

640?wx_fmt=png&tp=webp&wxfrom=5&wx_lazy=

不同名稱的文件用于存放特定功能的代碼,這些將會在后面詳細介紹。總之這個應用的文件夾結構 django 已經為我們建立好了,但目前它還只是包含各種文件的一個文件夾而已,django 并不知道這是一個應用,我們得告訴 django 這是我們創建的應用,專業一點說就是:在 django 的配置文件中注冊這個應用。打開 blogproject 目錄下的 settings.py 文件,看名字就知道 settings.py 是一個設置文件(setting 意為設置),找到 INSTALLED_APPS 設置項,將 blog 添加進去。?

640?wx_fmt=png&tp=webp&wxfrom=5&wx_lazy=

可以看到 django 已經為我們提供了一些內置的應用,這些應用為我們提供了各種各樣的功能,這就是 django 強大的地方,通用的功能它都幫我們寫好了,我們只需編寫與自身業務相關的功能代碼。

編寫博客的數據庫模型

博客最主要的功能就是展示我們寫的文章,它需要從某個地方獲取我們寫的博客文章數據才能把它展示出來,通常來說這個地方就是數據庫。我們把寫好的文章永久地保存在數據庫里,當用戶訪問我們的博客時,django 就去數據庫里把這些數據取出來展現給用戶。

博客的文章應該含有標題、正文、作者、發表時間等數據,一個更加現代化的博客文章我們也希望它有分類、標簽、評論等。為了更好地存儲這些數據,我們需要合理地組織我們數據庫的結構。

我們的博客初級版本主要包含這些數據:博客文章,文章會有分類以及標簽。一篇文章只能有一個分類,但可以打上很多標簽。數據庫存儲的數據其實就是表格的形式,例如存儲我們的博客文章的數據庫表長這個樣子:

640?wx_fmt=png&tp=webp&wxfrom=5&wx_lazy=

其中 id 是一個數字,唯一對應著一篇文章。當然還可以在列上加入更多的信息,這只是一個最基本的示例。

數據庫表設計成這樣其實已經可以了,但是稍微分析一下我們就會發現一個問題,這 3 篇文章的分類和標簽都是相同的,這會產生很多重復數據,當數據量很大時就浪費了存儲空間。不同的文章可能它們的分類或者標簽是相同的,所以我們把分類和標簽拿出來,做成單獨的數據庫表,再把文章和分類與標簽關聯起來就可以了。下面分別是分類和標簽的數據庫表:

640?wx_fmt=png&tp=webp&wxfrom=5&wx_lazy=

以上是自然語言描述的表格,數據庫也和編程語言一樣,有它自己的一套規定的語法來生成上述的表格結構,這樣我們才能把數據存進去。一般情況下這時候我們應該先去學習數據庫創建表格的語法,再回來寫我們的博客程序了。但是 django 跟我們說不用這么麻煩,我已經幫你做了一些事情,我把那一套數據庫的語法轉換成了 Python 的語法形式,你寫你的 Python 代碼就可以了,翻譯的工作我來幫你。用更加專業一點的說法,就是 django 為我們提供了一套 ORM(Object Relational Mapping)系統。比如說我們的分類數據庫表,django 只要求我們這樣寫:

640?wx_fmt=png&tp=webp&wxfrom=5&wx_lazy=

這就是一個標準的 Python 的類,我們繼承了 models.Model 類,類名為 Category(分類),Category 類有一個屬性 name,它是 models.CharField 的一個實例。這樣,django 就可以把這個類翻譯成數據庫的語法,在數據庫里創建一個名為 category 的表格,這個表格的一個列名為 name(即分類名),還有一個列 id 則會自動幫我們創建。其規則就是一個 Python 類對應一個數據庫表格,類名即表名,類的屬性對應著表格的列,屬性名即列名。我們需要 3 個表格:文章(Post)、分類(Category)以及標簽(Tag),下面就來創建它們。已經在代碼中做了詳細的注釋,說明每一句代碼的含義。但如果你在移動端下閱讀不便的話,也可以跳到代碼后面看正文的里的講解。

640?wx_fmt=png&tp=webp&wxfrom=5&wx_lazy=

640?wx_fmt=png&tp=webp&wxfrom=5&wx_lazy=

640?wx_fmt=png&tp=webp&wxfrom=5&wx_lazy=

640?wx_fmt=png&tp=webp&wxfrom=5&wx_lazy=


數據庫模型詳解

首先是 Category(分類)和 Tag(標簽)類,它們均繼承自 model.Model 類,這是 django 規定的。它們均有一個 name 屬性,用來存儲它們的名稱。由于分類名和標簽名一般都是用字符串表示,因此我們使用了 CharField 來指定 name 的數據類型,同時 max_length 參數則指定 name 的最大長度。除了 CharField ,django 還為我們提供了更多內置的數據類型,比如時間類型 DateTimeField、整數類型 IntegerField 等等。在本教程中我們會教你這些類型的使用方法,但以后你開發自己的項目時,你就需要通過閱讀 django 的官方文檔關于字段類型的介紹來了解有哪些數據類型以及如何使用它們。
Post(文章)類也一樣,必須繼承自 model.Model 類。文章的數據庫表稍微復雜一點,主要是列更多。我們為它指定了這些列:

8481c8f592b7f349aa84a1de5c171db681516edftitle。這是文章的標題,數據類型是 CharField,最大長度 max_length = 70。
8481c8f592b7f349aa84a1de5c171db681516edfbody。文章正文,我們使用了 TextField。比較短的字符串存儲可以使用 CharField,但對于文章的正文來說可能會是一大段文本,因此使用 TextField 來存儲大段文本。
8481c8f592b7f349aa84a1de5c171db681516edfcreated_time、modified_time。這兩個列分表表示了文章的創建時間和最后一次修改時間,存儲時間的列用 DateTimeField 數據類型
8481c8f592b7f349aa84a1de5c171db681516edfexcerpt。文章摘要,可以沒有文章摘要,但默認情況下 CharField 要求我們必須存入數據,否則就會報錯。指定 blank=True 后就可以允許空值了。
8481c8f592b7f349aa84a1de5c171db681516edfcategory 和 tags。這是分類與標簽,分類與標簽的模型我們已經定義在上面。我們在這里把文章對應的數據庫表和分類與標簽對應的表關聯起來,但是關聯形式稍微有點不同。我們規定一篇文章只能對應一個分類,但是一個分類下可以有很多篇文章,所以我們使用的是 ForeignKey,即一對多的關系。而對于標簽來說,一篇文章可以有多個標簽,同一個標簽下也可能有多篇文章,所以我們使用 ManyToManyField,表明這是多對多的關系。同時我們規定文章可以沒有標簽,因此為標簽 tags 指定了 blank=True。
8481c8f592b7f349aa84a1de5c171db681516edfauthor。文章作者,這里 User 是從 django.contrib.auth.models 導入的。django.contrib.auth 是 django 內置的應用,專門用于處理網站用戶的注冊、登錄等流程,User 是 django 為我們已經寫好的用戶模型,這里我們通過 ForeignKey 把文章和 User 關聯起來,因為我們規定一篇文章只能有一個作者,而一個作者可能會寫多篇文章,因此這是一對多的關系,和 Category 類似。

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



原文發布時間為:2017-04-22
本文作者:追夢人物
本文來自云棲社區合作伙伴“Python中文社區”,了解相關信息可以關注“Python中文社區”微信公眾號

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/539149.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/539149.shtml
英文地址,請注明出處:http://en.pswp.cn/news/539149.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

python將16進制字符串轉換為整數_Python 16進制與字符串的轉換

電腦上裝了Python2.7和3.3兩個版本,平時運行程序包括在Eclipse里面調試都會使用2.7,但是由于某些原因在cmd命令行中輸入python得到的解釋器則是3.3, 一直沒對此做處理,因為這樣可以對兩個版本的差異有一個測試,而且虛擬機里面是2.…

python多個文件打包成exe_多個py文件生成一個可運行exe文件

一、概述 目前有一個python腳本,需要在別的電腦中運行,安裝python環境太麻煩,封裝成exe文件,運行比較方便。 二、演示 環境說明 python版本:3.7.9 操作系統:windows 10 安裝模塊 pip3 installer pyinstaller 封裝 新建目錄test,目錄結構如下: ./├── conf.py └── …

CSV文件的轉義處理

原文:http://blog.csdn.net/maqingli20/article/details/7095132 ------------------------------------------------------------------------------------ CSV文件是一種適合程序格式化輸出數據的文件格式。它使用英文逗號作為列分隔符,文件可以直接用…

華為讀取版本exe_關于esrv_svc.exe和SurSvc.exe疑似泄露用戶信息的猜測

封面圖片來源:https://www.weibo.com/1885454921/GpBhR3vpk?typerepost#_rnd1573301201348抱歉,寫網頁文章的次數不多,排版沒研究過,請原諒。下面是正題:由來:最初是借由火絨的自定義防護規則,…

gitlab ci mysql_php-Gitlab CI:在階段之間保留MySQL數據

根據Gitlab問題頁面:Share service between build stages.Gitlab-CI的設置方式如下:each job is run in each job is run independently of the others,including potentially running on different machines. And the servicesare run locally on each …

flask 部署_只需10分鐘!就能用Flask,Docker和Jenkins部署機器學習模型

摘要: 一杯茶的功夫部署完成機器學習模型!在生產環境中部署機器學習模型是數據工程中經常被忽視的領域。網上的大多數教程/博客都側重于構建、訓練和調整機器學習模型。如果它不能用于實際的預測,那么它又有什么用呢? 接下來了解一…

Hive 導入CSV文件

SerDe 介紹 Hive 使用如下FileFormat 類讀寫 HDFS files: TextInputFormat/HiveIgnoreKeyTextOutputFormat: 讀寫普通HDFS文本文件. SequenceFileInputFormat/SequenceFileOutputFormat: 讀寫SequenceFile格式的HDFS文件. Hive 使用如下SerDe 類(反)序列化數據: MetadataTyp…

騰訊云mysql架構_一個數據庫存儲架構的獨白

本文由云社區發表本文作者:許中清,騰訊云自研數據庫CynosDB的分布式存儲CynosStore負責人。從事數據庫內核開發、數據庫產品架構和規劃。曾就職于華為,2015年加入騰訊,參與過TBase(PGXZ)、CynosDB等數據庫產品研發。專注于關系數據…

Hive高級函數

Hive的函數太多了。用法和sql的差不多。 簡單查詢 select ... from...where... 使用各種函數 hive>show functions;//查看所有函數 hive>describe function explode;//查看函數的使用方法 LIMIT語句 列別名 嵌套select語句 標準函數: reverse() upper() ...…

groupby索引有效嗎_SQL IN 一定走索引嗎?

摘要IN 一定走索引嗎?那當然了,不走索引還能全部掃描嗎?好像之前有看到過什么Exist,IN走不走索引的討論。但是好像看的太久了,又忘記了。哈哈,如果你也忘記了MySQL中IN是如何查詢的,就來復習下吧。問題問題…

mysql函數使用場景_mysql的函數和存儲過程的比較,以及在實際場景中的使用案例...

一.存儲過程和函數的區別函數調用有返回值存儲過程調用用call語句,函數調用直接飲用函數名參數IN,OUT,INOUT只適用于存儲過程,對函數而言所有參數默認都是輸入參數IN用于把數值傳入到存儲過程中OUT用于輸出參數將數值傳遞給調用者…

hive性能調優

原文:http://www.tuicool.com/articles/rMvQvm ---------------------------------------------------------------------- limit 限制調整 -- 因為使用 limit 語句時候,是先執行整個查詢語句,然后再返回部分結果的 set hive.limit.optimize…

推薦系統之 BPR 算法及 Librec的BPR算法實現【1】

【推薦系統之 BPR 算法】 1、關于BPR的論文原文: BPR: Bayesian Personalized Ranking from Implicit Feedback 2、參考1:論文快讀 - BPR: Bayesian Personalized Ranking from Implicit Feedback (該博主的網站不錯,尤其論文快…

ios 篩選_萬千網友讓quot;低調使用quot;的軟件!居然還支持iOS

點擊藍字關注我們昨天的耳朵神器大家感覺怎么樣?享受了耳朵今天我們享受一下眼睛~可能很多同學對漫畫是情有獨鐘但是,之前小黑一直介紹的都是安卓端的軟件今天要給大家介紹的這款軟件是IOS安卓都有終于可以不被IOS的同學吐槽了而且經過測試小黑真的想說一…

Linux卸載/刪除多余網卡

卸載 使用命令ifconfig命令查看網卡情況 確認自己使用的是哪一塊網卡,然后把其它的網卡都卸載掉。 運行命令ifconfig 網卡名稱 down。 如: ifconfig eth1 down 再次運行ifconfig就會發現被卸載掉的網卡沒了。現在可以ping 一下內網的IP試試看能不能pin…

CentOS7:JDK1.7.0_80安裝

一、安裝前檢查 執行以下命令: rpm -qa | grep jdk 查看系統是否已經自帶openjdk,如果存在 執行以下命令: yum -y remove files files為查出的、系統自帶的openjdk相關文件,運行以上命令將相關文件卸載 執行命令 java -version[rootlocalhost…

python海龜繪圖畫圣誕帽男人_python海龜繪圖實例教程

本文以實例形式介紹了python turtle模塊即海龜繪圖的使用方法,對于需要進行圖形編程的朋友相信會有一定的借鑒價值。python turtle模塊簡介:python2.6版本中引入的一個簡單的繪圖工具,叫做海龜繪圖(turtle graphics)1.使用海龜繪圖首先我們需…

spring+mybatis 多數據源整合

原文&#xff1a;http://blog.csdn.net/fhx007/article/details/12530735 ---------------------------------------------------------------------------------- 直接看spring的配置吧 <!-- 數據源配置 --> <bean id"ds1" class"org.apache.commo…

四管前級怎么去掉高低音音調_一些歌曲音調太高怎么才能唱上去??

展開全部首先得提高肺活量 然后就是練聲&#xff01;怎 樣 練 聲&#xff1a;練聲的目的1&#xff0c;使歌唱發聲系統各器官的肌肉更e68a84e8a2ad62616964757a686964616f31333236373231有力&#xff0c;并能協調一致。2&#xff0c;建立正確的聲音概念。3&#xff0c;擴展音域&…

python繪制星空_用python畫星空源代碼是什么?

用python畫星空源代碼是什么&#xff1f;用python畫星空源代碼是from turtle import *from random import random,randintscreen Screen()width ,height 800,600screen.setup(width,height)screen.title("模擬3D星空")screen.bgcolor("black")screen.mod…