1.前言
上文中我們?cè)趘iews中的傳遞了一個(gè)字典,然后在templates中顯示了出來(lái),在實(shí)際的操作中不可能都這么傳遞數(shù)據(jù),這里就需要用到數(shù)據(jù)庫(kù)。第一節(jié)時(shí)我們創(chuàng)建django項(xiàng)目時(shí),默認(rèn)生成了一個(gè)sqlite數(shù)據(jù)庫(kù)文件,django默認(rèn)使用的就是sqlite數(shù)據(jù)庫(kù)。
2.django的models
django項(xiàng)目下創(chuàng)建一個(gè)app的時(shí)候,會(huì)自動(dòng)生成一個(gè)models文件,models采用的是ORM(對(duì)象關(guān)系映射)機(jī)制,對(duì)于開(kāi)發(fā)者來(lái)講,只需要直接操作類(lèi)對(duì)象,無(wú)需關(guān)注底層的數(shù)據(jù)庫(kù)操作,也就是說(shuō)不用直接操作sql。
首先,我們的blog中最重要的是顯示文件,那么一定有一個(gè)文章類(lèi),我們?cè)趍odels中創(chuàng)建一個(gè)名為article的文章類(lèi):
from django.db import models
from django.contrib.auth.models import User
class Article(models.Model):
title = models.CharField(max_length=32, default='')
# 文章正文,使用的是TextField
# 存儲(chǔ)比較短的字符串可以使用 CharField,但對(duì)于文章的正文來(lái)說(shuō)可能會(huì)是一大段文本,因此使用 TextField 來(lái)存儲(chǔ)大段文本。
content = models.TextField(null=True)
這里models的用法,比如CharFiled、TextField等等的用法,可以查看官方文檔看一下。
然后在終端中,執(zhí)行以下命令
python3 manage.py makemigrations
Migrations for 'blog':
blog/migrations/0001_initial.py
- Create model Article
當(dāng)我們執(zhí)行了 python manage.py makemigrations 后,Django 在 blog 應(yīng)用的 migrations\ 目錄下生成了一個(gè) 0001_initial.py 文件,這個(gè)文件是 Django 用來(lái)記錄我們對(duì)模型做了哪些修改的文件。目前來(lái)說(shuō),我們?cè)?models.py 文件里創(chuàng)建了 1 個(gè)模型類(lèi),Django 把這些變化記錄在了 0001_initial.py 里。
不過(guò)此時(shí)還只是告訴了 Django 我們做了哪些改變,為了讓 Django 真正地為我們創(chuàng)建數(shù)據(jù)庫(kù)表,接下來(lái)又執(zhí)行了 python manage.py migrate 命令。Django 通過(guò)檢測(cè)應(yīng)用中 migrations\ 目錄下的文件,得知我們對(duì)數(shù)據(jù)庫(kù)做了哪些操作,然后它把這些操作翻譯成數(shù)據(jù)庫(kù)操作語(yǔ)言,從而把這些操作作用于真正的數(shù)據(jù)庫(kù)。如果你想知道Django幫你做了什么,可以在終端中輸入以下命令:
python3 manage.py sqlmigrate blog 0001
BEGIN;
--
-- Create model Article
--
CREATE TABLE "blog_article" ("id" integer NOT NULL PRIMARY KEY AUTOINCREMENT, "title" varchar(32) NOT NULL, "content" text NULL);
COMMIT;
看到?jīng)],django幫你寫(xiě)了sql語(yǔ)句。
記著最重要的一步,此時(shí)django只是根據(jù)你創(chuàng)建的對(duì)象生成了sql語(yǔ)句,但是并未執(zhí)行,也就是說(shuō)現(xiàn)在并為創(chuàng)建數(shù)據(jù)表,繼續(xù)輸入以下命令:
python3 manage.py migrate
用SQLiteManager工具打開(kāi)項(xiàng)目下的db.sqlite3文件,發(fā)現(xiàn)增加了很多張表,其中blog_article(為什么表名前面有blog_,這個(gè)我想不用解釋了)表就是我們創(chuàng)建的,其他的表均是django自動(dòng)生成的,我們可以不管。
3.django數(shù)據(jù)庫(kù)的增刪改查
3.1 往數(shù)據(jù)庫(kù)中存數(shù)據(jù)
在終端中輸入python3 manage.py shell
進(jìn)入python命令交互欄輸入以下內(nèi)容:
>>> from blog.models import Article
>>> article = Article(title='我是標(biāo)題', content='我是內(nèi)容')
>>> article.save()
此時(shí),再看看數(shù)據(jù)庫(kù)中,blog_article下是不是多了一條記錄呢。
3.2 刪除數(shù)據(jù)
操作同上:
>>> from blog.models import Article
>>> article = Article.objects.get(title='我是標(biāo)題')
>>> article.delete
3.3 修改數(shù)據(jù)
操作同上:
>>> from blog.models import Article
>>> article = Article.objects.get(title='我是標(biāo)題')
>>> article.title = '我是新標(biāo)題'
>>> article.save()
3.4 查詢(xún)數(shù)據(jù)
操作同上:
>>> from blog.models import Article
>>> Article.objects.all()
4.我要顯示數(shù)據(jù)
接著第二節(jié)的內(nèi)容,我們修改views.py內(nèi)容,將數(shù)據(jù)庫(kù)中的數(shù)據(jù)讀出來(lái),并傳遞給對(duì)應(yīng)的模板:
from django.shortcuts import render
from django.http import HttpResponse
from . import models
# def index(request):
# return HttpResponse('天行健,君子自強(qiáng)不息!')
def index(request):
article = models.Article.objects.get(pk=1)
return render(request, 'blog/index.html', {'article': article})
切記,render函數(shù)的傳值傳遞的是一個(gè)字典:
然后修改blog下的index.html文件如下:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>我愛(ài)編程</title>
</head>
<body>
<h1>文章標(biāo)題是:{{ article.title }}</h1>
<h1>文章內(nèi)容是:{{ article.content }}</h1>
</body>
</html>
在html文件中獲取對(duì)應(yīng)的字段,article.title,article.content。
此時(shí),運(yùn)行一下服務(wù),記得訪(fǎng)問(wèn)路徑是127.0.0.1:8000/blog/index/,是不是就可以把內(nèi)容顯示出來(lái)了呢:
5.小結(jié)
在操作數(shù)據(jù)庫(kù)時(shí),Django幫我們做了大量的工作,大大減少了我們的工作量,但是這一切的前提都是你對(duì)django的models機(jī)制非常熟悉,否則你都不知道怎么修改。django默認(rèn)使用的sqlite,后面我們?cè)谡f(shuō)如何切換到mysql等數(shù)據(jù)庫(kù)。