Python3.0 Django2.0.4 搭建項目(二)

接上一篇Python3.0 Django2.0.4 搭建項目(一)記錄,這一篇主要記錄我們將建立數(shù)據(jù)庫庙楚,創(chuàng)建第一個模型很魂,還有 Django 提供的自動生成的admin管理頁面。

數(shù)據(jù)庫配置

打開 mysite/settings.py文件咏瑟,里面有一個INSTALLED_APPS拂到,我們可以了解一下這里面Django 的自帶應用

django.contrib.admin -- 管理員站點, 你很快就會使用它码泞。
django.contrib.auth -- 認證授權(quán)系統(tǒng)兄旬。
django.contrib.contenttypes -- 內(nèi)容類型框架。
django.contrib.sessions -- 會話框架余寥。
django.contrib.messages -- 消息框架领铐。
django.contrib.staticfiles -- 管理靜態(tài)文件的框架。

這些應用被默認啟用是為了給常規(guī)項目開發(fā)提供方便宋舷。

在上一篇中我們有提到一個數(shù)據(jù)庫的問題绪撵,這是默認開啟的某些應用需要至少一個數(shù)據(jù)表,所以祝蝠,在使用他們之前需要在數(shù)據(jù)庫中創(chuàng)建一些表音诈⌒诶矗可以使用一下命令:

python manage.py migrate

創(chuàng)建模型

在 polls/models.py 文件添加代碼:

from django.db import models


class Question(models.Model):
    question_text = models.CharField(max_length=200)
    pub_date = models.DateTimeField('date published')


class Choice(models.Model):
    question = models.ForeignKey(Question, on_delete=models.CASCADE)
    choice_text = models.CharField(max_length=200)
    votes = models.IntegerField(default=0)

這段代碼主要創(chuàng)建兩個模型,每個模型被表示為 django.db.models.Model 類的子類改艇。每個模型有一些類變量收班,它們都表示模型里的一個數(shù)據(jù)庫字段。

每個字段都是 Field 類的實例谒兄,比如摔桦,字符字段被表示為CharField,期時間字段被表示為 DateTimeField承疲。

每個 Field 類實例變量的名字(例如 question_text 或 pub_date )也是字段名邻耕,我們會在在 Python 代碼里使用它們,而數(shù)據(jù)庫會將它們作為列名燕鸽。

定義Field類需要參數(shù)兄世。例如 CharField 需要一個 max_length 參數(shù)。這個參數(shù)的用處不止于用來定義數(shù)據(jù)庫結(jié)構(gòu)啊研,也用于驗證數(shù)據(jù)御滩。

Field 也能夠接收多個可選參數(shù);在上面的例子中:我們將 votes 的 default 也就是默認值党远,設為0削解。

最后,我們使用 ForeignKey 定義了一個關系沟娱。這將告訴 Django氛驮,每個 Choice 對象都關聯(lián)到一個 Question 對象。Django 支持所有常用的數(shù)據(jù)庫關系:多對一济似、多對多和一對一矫废。

激活模型

通過上面創(chuàng)建模型,Django可以幫我們做一下幾個事情:

1.為應用創(chuàng)建數(shù)據(jù)庫 chemea(生成 CREATE TABLE 語句)砰蠢。
2.創(chuàng)建可以與 Question 和 Choice 對象進行交互的 Python 數(shù)據(jù)庫 API蓖扑。

但是前提是我們得先把polls應用安裝到我們的項目里面。

可以在INSTALLED_APPS里面加上'polls'或者'polls.apps.PollsConfig'

INSTALLED_APPS = [
    'polls.apps.PollsConfig',
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
]

經(jīng)過上面的操作我們已經(jīng)注冊polls這個應用了娩脾,因為我們之前對模型做了一些改變赵誓,并且你想要把這些改變保存為 migration。接著運行下面的命令:

python manage.py makemigrations polls

可以看到以下輸出:


image.png

這個命令是什么意思柿赊,做了什么操作呢俩功?我們可以通過一下命令查看

python manage.py sqlmigrate polls 0001

以下就是通過這個命令輸出的log

BEGIN;
--
-- Create model Choice
--
CREATE TABLE "polls_choice" ("id" integer NOT NULL PRIMARY KEY AUTOINCREMENT, "choice_text" varchar(200) NOT NULL, "votes" integer NOT NULL);
--
-- Create model Question
--
CREATE TABLE "polls_question" ("id" integer NOT NULL PRIMARY KEY AUTOINCREMENT, "question_text" varchar(200) NOT NULL, "pub_date" datetime NOT NULL);
--
-- Add field question to choice
--
ALTER TABLE "polls_choice" RENAME TO "polls_choice__old";
CREATE TABLE "polls_choice" ("id" integer NOT NULL PRIMARY KEY AUTOINCREMENT, "choice_text" varchar(200) NOT NULL, "votes" integer NOT NULL, "question_id" integer NOT NULL REFERENCES "polls_question" ("id") DEFERRABLE INITIALLY DEFERRED);
INSERT INTO "polls_choice" ("id", "choice_text", "votes", "question_id") SELECT "id", "choice_text", "votes", NULL FROM "polls_choice__old";
DROP TABLE "polls_choice__old";
CREATE INDEX "polls_choice_question_id_c5b4b260" ON "polls_choice" ("question_id");
COMMIT;

從上面可以看出來,是執(zhí)行了創(chuàng)建數(shù)據(jù)庫表的命令碰声。
以上有幾點需要注意:

1.數(shù)據(jù)庫的表名是由應用名(polls)和模型名的小寫形式( question 和 choice)連接而來诡蜓。例如polls_question和polls_choice

2.主鍵(IDs)會被自動創(chuàng)建

3.Django默認會在外鍵字段名后追加字符串 "_id" 

4.外鍵關系由 FOREIGN KEY 生成

5.生成的 SQL 語句是為你所用的數(shù)據(jù)庫定制的,所以那些和數(shù)據(jù)庫有關的字段類型胰挑,比如 auto_increment (MySQL)蔓罚、 serial (PostgreSQL)和 integer primary key autoincrement (SQLite)椿肩,Django 會幫你自動處理。那些和引號相關的事情 - 例如豺谈,是使用單引號還是雙引號 - 也一樣會被自動處理郑象。

6.這個 sqlmigrate 命令并沒有真正在你的數(shù)據(jù)庫中的執(zhí)行遷移 - 它只是把命令輸出到屏幕上,讓你看看 Django 認為需要執(zhí)行哪些 SQL 語句

再次執(zhí)行 migrate 命令茬末,在數(shù)據(jù)庫里創(chuàng)建新定義的模型的數(shù)據(jù)表

python manage.py migrate
Operations to perform:
  Apply all migrations: admin, auth, contenttypes, polls, sessions
Running migrations:
  Applying polls.0001_initial... OK

綜上可以總結(jié)一下數(shù)據(jù)庫創(chuàng)建遷移大概需要三個步驟:

1.編輯 models.py 文件厂榛,改變模型。

2.運行 python manage.py makemigrations 為模型的改變生成遷移文件丽惭。

3.運行 python manage.py migrate 來應用數(shù)據(jù)庫遷移击奶。

數(shù)據(jù)庫操作

首先我們在終端輸入命令python manage.py shell,然后關聯(lián)我們剛才創(chuàng)建的數(shù)據(jù)庫表
操作數(shù)據(jù)庫一般就是增刪改查這些操作

obj = Question(question_text="What's new?", pub_date=timezone.now())
q.save()

q = Question.objects.get(pk=1)
c = q.choice_set.filter(choice_text__startswith='Just hacking')
c.delete()

q = Question.objects.get(pk=1)
q.question_text = "How old are you?"
q.save()

1.Question.objects.all() 獲取全部數(shù)據(jù)

2.Question.objects.filter(question_text__startswith='What')   獲取question_text以'What'開始的數(shù)據(jù)

3.Question.objects.exclude(question_text__startswith='What') 獲取除了question_text以'What'開始的數(shù)據(jù)

4.Question.objects.get(id=1) 獲取id=1的單條數(shù)據(jù),不存在則報錯(不建議)

這里涉及到我們對models.py的一些修改责掏,如下

class Question(models.Model):
    question_text = models.CharField(max_length=200)
    pub_date = models.DateTimeField('date published')

    def __str__(self):
        return self.question_text

    def was_published_recently(self):
        return self.pub_date >= timezone.now() - datetime.timedelta(days=1)


class Choice(models.Model):
    question = models.ForeignKey(Question, on_delete=models.CASCADE)
    choice_text = models.CharField(max_length=200)
    votes = models.IntegerField(default=0)

    def __str__(self):
        return self.choice_text

介紹 Django 管理頁面

首先柜砾,我們需要創(chuàng)建一個能登錄管理頁面的用戶。運行下面的命令:

python manage.py createsuperuser

根據(jù)提示輸入用戶名换衬,郵箱和密碼就可以創(chuàng)建好賬號了痰驱,效果如下圖

image.png

接下來在瀏覽器中輸入http://127.0.0.1:8000/admin/,你就會看見管理員登錄界面冗疮,通過剛才創(chuàng)建的賬號登錄萄唇,可以看到進入了管理界面,如圖

image.png

向管理頁面中加入我們創(chuàng)建的應用
在polls/admin.py里面添加需要放到我們管理頁面的功能术幔,修改polls/admin.py文件

from django.contrib import admin

from .models import Question

admin.site.register(Question)

刷新一下頁面,可以看到Question已經(jīng)在我們的管理列表里面了

image.png

點擊Question就可以就可以看到對應的管理列表了湃密,可以通過點擊“What's up”來編輯這個選項

image.png

注意事項:

1.這個表單是從 Question 模型中自動生成的
2.不同的字段類型(日期時間字段 DateTimeField 诅挑、字符字段 CharField)會生成對應的 HTML 輸入控件。
3.每個日期時間字段 DateTimeField 都有 JavaScript泛源,可以直接選擇日期

頁面功能:

1.保存(Save) - 保存改變拔妥,然后返回對象列表。
2.保存并繼續(xù)編輯(Save and continue editing) - 保存改變达箍,然后重新載入當前對象的修改界面没龙。
3.保存并新增(Save and add another) - 保存改變,然后添加一個新的空對象并載入修改界面缎玫。
4.刪除(Delete) - 顯示一個確認刪除頁面硬纤。

接下來就可以在編輯界面做相應的增刪改查操作了。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末赃磨,一起剝皮案震驚了整個濱河市筝家,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌邻辉,老刑警劉巖溪王,帶你破解...
    沈念sama閱讀 222,729評論 6 517
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件腮鞍,死亡現(xiàn)場離奇詭異,居然都是意外死亡莹菱,警方通過查閱死者的電腦和手機移国,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,226評論 3 399
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來道伟,“玉大人,你說我怎么就攤上這事皱卓」ィ” “怎么了?”我有些...
    開封第一講書人閱讀 169,461評論 0 362
  • 文/不壞的土叔 我叫張陵娜汁,是天一觀的道長嫂易。 經(jīng)常有香客問我,道長掐禁,這世上最難降的妖魔是什么怜械? 我笑而不...
    開封第一講書人閱讀 60,135評論 1 300
  • 正文 為了忘掉前任,我火速辦了婚禮傅事,結(jié)果婚禮上缕允,老公的妹妹穿的比我還像新娘。我一直安慰自己蹭越,他們只是感情好障本,可當我...
    茶點故事閱讀 69,130評論 6 398
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著响鹃,像睡著了一般驾霜。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上买置,一...
    開封第一講書人閱讀 52,736評論 1 312
  • 那天粪糙,我揣著相機與錄音,去河邊找鬼忿项。 笑死蓉冈,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的轩触。 我是一名探鬼主播寞酿,決...
    沈念sama閱讀 41,179評論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼怕膛!你這毒婦竟也來了熟嫩?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 40,124評論 0 277
  • 序言:老撾萬榮一對情侶失蹤褐捻,失蹤者是張志新(化名)和其女友劉穎掸茅,沒想到半個月后椅邓,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,657評論 1 320
  • 正文 獨居荒郊野嶺守林人離奇死亡昧狮,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,723評論 3 342
  • 正文 我和宋清朗相戀三年景馁,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片逗鸣。...
    茶點故事閱讀 40,872評論 1 353
  • 序言:一個原本活蹦亂跳的男人離奇死亡合住,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出撒璧,到底是詐尸還是另有隱情透葛,我是刑警寧澤,帶...
    沈念sama閱讀 36,533評論 5 351
  • 正文 年R本政府宣布卿樱,位于F島的核電站僚害,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏繁调。R本人自食惡果不足惜萨蚕,卻給世界環(huán)境...
    茶點故事閱讀 42,213評論 3 336
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望蹄胰。 院中可真熱鬧岳遥,春花似錦、人聲如沸裕寨。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,700評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽宾袜。三九已至妻往,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間试和,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,819評論 1 274
  • 我被黑心中介騙來泰國打工纫普, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留阅悍,地道東北人。 一個月前我還...
    沈念sama閱讀 49,304評論 3 379
  • 正文 我出身青樓昨稼,卻偏偏與公主長得像节视,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子假栓,可洞房花燭夜當晚...
    茶點故事閱讀 45,876評論 2 361

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