知識(shí)詳解4:django之models與數(shù)據(jù)表

封面.jpg

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
1.png

用SQLiteManager工具打開(kāi)項(xiàng)目下的db.sqlite3文件,發(fā)現(xiàn)增加了很多張表,其中blog_article(為什么表名前面有blog_,這個(gè)我想不用解釋了)表就是我們創(chuàng)建的,其他的表均是django自動(dòng)生成的,我們可以不管。


2.png

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)了呢:


4.png

5.小結(jié)

在操作數(shù)據(jù)庫(kù)時(shí),Django幫我們做了大量的工作,大大減少了我們的工作量,但是這一切的前提都是你對(duì)django的models機(jī)制非常熟悉,否則你都不知道怎么修改。django默認(rèn)使用的sqlite,后面我們?cè)谡f(shuō)如何切換到mysql等數(shù)據(jù)庫(kù)。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀(guān)點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

推薦閱讀更多精彩內(nèi)容