? ?在第一部分我們完成了安裝以及簡單的創(chuàng)建工程和應(yīng)用氯窍,今天我們繼續(xù)學(xué)習(xí)后面的內(nèi)容。
一驳糯、數(shù)據(jù)庫設(shè)置
? ? ? ?首先我們打開我們的myfirstsite工程下的setting.py文件痘拆。
默認(rèn)配置使用的是sqlite數(shù)據(jù)庫,如果我們剛接觸數(shù)據(jù)庫或者只是對python感興趣除秀,默認(rèn)配置是最簡單的選擇。python自帶了sqlite算利,因此我們不需要額外安裝册踩。如果我們需要使用別的數(shù)據(jù)庫例如mysql、oracle效拭、postgresql等我們則需要得先安裝好數(shù)據(jù)庫(安裝過程這里不贅述暂吉,本文使用mysql),然后修改setting.py配置文件
我們將這里的ENGINE(類似java中mysql驅(qū)動)缎患,NAME(數(shù)據(jù)庫名) 配置項(xiàng)全部改為我需要的mysql配置慕的,另外需要配置數(shù)據(jù)庫用戶名和密碼,以及host地址端口號
當(dāng)然還有其他配置項(xiàng)较锡,具體參考https://docs.djangoproject.com/en/2.1/ref/settings/#std:setting-DATABASES
執(zhí)行
?python manage.py migrate?
執(zhí)行結(jié)束后我們 show tables 發(fā)現(xiàn)我們的庫里多了好多張表:
什么鬼业稼?怎么這么多表?通過官方文檔我了解到其實(shí)完全可以不要這些表蚂蕴,其實(shí)很簡單低散,只要我們在執(zhí)行python manage.py migrate 之前將myfirstsite/settings.py 文件中的INSTALLED_APPS配置項(xiàng)把我們不想要的刪掉即可。migrate 只會跑我們在INSTALLED_APPS中配置的app骡楼。
二熔号、創(chuàng)建模型
我們現(xiàn)在可以定義我們自己的模型了,我們就在我們先前創(chuàng)建的polls應(yīng)用里定義兩個吧鸟整,
?Question(問題) 和 Choice(選項(xiàng))引镊,Question 中我們可以頂問題描述和發(fā)布日期,而Choice中我們可以定義選項(xiàng)描述和投票記錄篮条。每一個Choice與一個Question關(guān)聯(lián)弟头。
我們創(chuàng)建的Question和Choice類均繼承models模塊的Model類,類中我們定義的屬性后續(xù)的代碼中會使用涉茧,而且會被Django當(dāng)作數(shù)據(jù)表的列名使用 比如 question_text 或者pub_date ,同時(shí)我們通過models模塊給這些屬性定義了類型赴恨,比如question_text = models.CharField(max_length=200) 我們告訴Django question_text 是一個字符串類型并且最大長度是200(后續(xù)學(xué)習(xí)中我們會發(fā)現(xiàn)不僅在數(shù)據(jù)庫有用,后面的validation校驗(yàn)也會很方便使用),pub_date=models.DateTimeField 告訴Django 伴栓,pub_date 是日期類型伦连。發(fā)現(xiàn),我們還使用了ForeignKey 聲明了Choice 和question的關(guān)聯(lián)關(guān)系钳垮。
? ? models中有許多屬性類是比傳參數(shù)的比如models.CharField 就必須設(shè)置max_length,當(dāng)然也是可以有一些可選參數(shù)的惑淳,例如choice_vote = models.IntegerField 我們設(shè)置的default值為0.
了解了這些models的屬性類,我們準(zhǔn)備開始激活我們新加的兩個model饺窿。激活之前我們必須得安裝我們的app歧焦,怎么安裝來著?對了肚医,在myfirstsite/settings.py 文件中的INSTALLED_APPS配置中添加我們的應(yīng)用就好了倚舀。
? ? 打開polls/app.py文件叹哭,我們發(fā)現(xiàn)早已經(jīng)有了一個PollsConfig類,那就簡單了:
我們只需要把這個PollsConfig類添加進(jìn)去就可以了痕貌。
配置好了之后我們執(zhí)行另外一條命令:
python manage.py makemigrations polls
這條命令其實(shí)就是告訴Django我們嗯polls的模型發(fā)生了改變风罩,我們這里是新建了兩個模型。
命令執(zhí)行成功舵稠。同時(shí)我們發(fā)現(xiàn)polls/migration目錄下多了一個0001_initial.py文件
我們準(zhǔn)備執(zhí)行這個文件超升,創(chuàng)建數(shù)據(jù)表結(jié)構(gòu),執(zhí)行命令:
python mange.py sqlmigrate polls 0001
執(zhí)行結(jié)束后我們發(fā)現(xiàn)打印出:
創(chuàng)建表的sql,然而我們發(fā)現(xiàn)數(shù)據(jù)庫里并沒有實(shí)際的創(chuàng)建表哺徊,這時(shí)候我們可以通過
?python?manage.py?check?命令去檢查 建表語句有沒有錯誤什么的
檢查好之后我們準(zhǔn)備真正的開始建表了:
python manage.py migrate?
執(zhí)行OK ,我們發(fā)現(xiàn)數(shù)據(jù)庫中多了兩張表(polls_quesion和polls_choice):
在我們開發(fā)的過程中難免會出現(xiàn)要修改表結(jié)構(gòu)或者新加或者刪除我們不想要的表室琢,那么migration對于我們來說非常重要。其實(shí)簡單總結(jié)一下就三步:
? ? ?1)修改模型class代碼(或新增模型落追,或刪除模型)
? ? ?2)執(zhí)行 python manage.py makgemigration 命令告訴Django 模型發(fā)生改變了
? ? ?3)執(zhí)行 python manage.py migration 命令讓Django真正的執(zhí)行我們所做的改變動作
三盈滴、調(diào)用API
執(zhí)行
python manage.py shell
進(jìn)入命令行
開始編寫代碼
先導(dǎo)入我們建好的model代碼,
查詢數(shù)據(jù)庫中的數(shù)據(jù)結(jié)果為空轿钠,new一個Question對象并保存:
發(fā)現(xiàn)我們的polls_question表中有了一條記錄:
修改q對象的question_text的值 并保存巢钓,然后我們再new 一個Question對象保存:
從圖中我們看到 第二次更改question_text 后再保存的時(shí)候 我們的庫中的值做了update操作
new出來的第二個對象插入是新插入表中了。