Django來敲門~第一部分【5.2.模型和數(shù)據(jù)庫交互】

為學(xué)日益辱士。為道日損泪掀。損之又損,以至於無為颂碘。無為而不為异赫。
——老子《道德經(jīng)》

書接上文,我們繼續(xù)

2. 數(shù)據(jù)庫配置【MySQL】

通常情況下凭涂,如果你只是做測試使用祝辣,可以使用Django內(nèi)置的數(shù)據(jù)庫SQLite就完全可以滿足需要了,我們在本次教程中切油,通過使用MySQL這個數(shù)據(jù)庫來完成后續(xù)的功能操作

我們首先要做的是蝙斜,在配置文件中指定數(shù)據(jù)庫的配置,先簡單了解一下

數(shù)據(jù)庫配置澎胡,首先要配置對應(yīng)的數(shù)據(jù)庫引擎對象和數(shù)據(jù)庫連接信息
在DATABASES的default配置中進(jìn)行默認(rèn)配置

  • ENGINE:數(shù)據(jù)庫引擎配置孕荠,可以從django.db.backends.sqlite3django.db.backends.postgresql攻谁、django.db.backends.mysql或者django.db.backends.oracle中選擇一個
  • NAME:數(shù)據(jù)庫名稱稚伍,也就是我們項目要連接的數(shù)據(jù)庫名稱,如果使用默認(rèn)的SQLite戚宦,數(shù)據(jù)庫就是一個保存在我們電腦上的文件个曙,NAME就必須指定絕對路徑(當(dāng)然這是廢話,Django已經(jīng)幫我們把這些事情都做好了)
  • 同時還可以使用USER受楼、PASSWORD垦搬、HOST等等這些配置來配置更加詳細(xì)的信息

注意:如果在項目中使用的數(shù)據(jù)庫不是默認(rèn)的SQLite,請確保你的數(shù)據(jù)庫是存在的

廢話不說艳汽,上干貨
打開mysite/mysite/settings.py配置文件猴贰,添加數(shù)據(jù)庫連接配置信息

# 引入pymysql模塊
import pymysql
# 指定按照mysqldb的方式使用
pymysql.install_as_MySQLdb()

# 修改DATABASES配置
DATABASES = {
    'default': {
        # 數(shù)據(jù)庫連接字符串
        'ENGINE':"django.db.backends.mysql",
        # 數(shù)據(jù)庫名稱
        "NAME":"pydb",
        # 數(shù)據(jù)庫登錄賬號
        "USER":"root",
        # 數(shù)據(jù)庫登錄密碼
        "PASSWORD":"",
        # 數(shù)據(jù)庫所在主機(jī)IP,本機(jī)可以不用填寫
        "HOST":"",
        # 數(shù)據(jù)庫連接端口河狐,MySQL默認(rèn)3306
        "PORT":"3306"
    }
}

這里需要注意米绕,大家可以看到,在mysite/mysite/settings.py文件的開頭馋艺,引入了pymysql并且調(diào)用了它的方法install_as_MySQLdb()
這是因為Django常規(guī)情況下使用的mysqldb模塊來連接數(shù)據(jù)庫栅干,但是python3.4+的版本還沒有對應(yīng)的mysqldb,目前使用的是第三方的pymysql模塊捐祠,所以這里進(jìn)行了這樣的改造碱鳞。

騷年,期待你在使用到時候雏赦,官方能提供和Python3.6配套的mysqldb來進(jìn)行數(shù)據(jù)庫操作劫笙。或者你直接參與到官方的開發(fā)隊伍中星岗,那就更完美了~

3. 創(chuàng)建模型應(yīng)用并和數(shù)據(jù)庫交互

3.1. 創(chuàng)建模型對象

常規(guī)情況下填大,我們需要在程序中,通過類和對象來封裝我們的數(shù)據(jù)俏橘,方便數(shù)據(jù)的統(tǒng)一管理和使用允华,Django中對模型對象的規(guī)范做的更加的統(tǒng)一了,通常情況下將模塊應(yīng)用對象會常見在應(yīng)用的模塊應(yīng)用/models.py文件中

廢話不說寥掐,直接上干貨:
在我們mysite項目的polls應(yīng)用中靴寂,創(chuàng)建模型對象

# 引入django.db模塊中的models模塊
from django.db import models

# 創(chuàng)建一個**問題**類型
class Question(models.Model):
    # 創(chuàng)建一個問題描述屬性,指定為字符串類型召耘,最大長度200個字符
    question_text = models.CharField(max_length = 200)
    # 創(chuàng)建一個發(fā)布時間屬性百炬,指定為日期時間類型
    pub_date = models.DateTimeField("date published")

# 創(chuàng)建一個**解決方案**類型
class Choice(models.Model):
    # 將解決方案和問題關(guān)聯(lián)起來,通過外鍵的形式
    question = models.ForeignKey(Question, on_delete=models.CASCADE)
    # 解決方案的描述信息污它,字符串剖踊,最大長度200
    choice_text = models.CharField(max_length=200)
    # 解決方案的投票總數(shù),整數(shù)類型衫贬,默認(rèn)0
    votes = models.IntegerField(default = 0)
3.2. 管理模型對象

一旦創(chuàng)建好了我們的模型類型德澈,需要在項目中使用這些模型和數(shù)據(jù)庫中的數(shù)據(jù)進(jìn)行交互,首先我們要做的是~將我們模塊應(yīng)用polls納入到項目管理中

很神奇的一句話:“納入到項目管理中”固惯,難道之前就木有在項目管理中嗎梆造?那我們是在啟動項目后怎么訪問到polls引用的視圖的呢?葬毫!

換一句話大家可能就明白了镇辉,你作為中華人民共和國的一等良民,國家財政會給你發(fā)補(bǔ)貼福利嗎供常?不會摊聋!但是如果把你納入到國家的編制中,你就可以享受國家財政給你發(fā)放的工資補(bǔ)貼福利等等資源了栈暇,這里也是一樣麻裁,前面創(chuàng)建的polls應(yīng)用只是項目中的一部分,我們只有通過類似編制的東東讓項目mysitepolls添加一個編制源祈,項目就可以處理模塊應(yīng)用polls/中的模型數(shù)據(jù)了

在我們項目中煎源,通過項目的mysite/mysite/settings.py配置文件的INSTALLED_APPS選項來進(jìn)行項目應(yīng)用的管理
默認(rèn)情況下mysite/mysite/settings.py配置信息如下

INSTALLED_APPS = [
    'django.contrib.admin',# 默認(rèn)提供的后臺管理網(wǎng)站
    'django.contrib.auth',# 權(quán)限認(rèn)證模塊
    'django.contrib.contenttypes',#內(nèi)容編碼框架模塊
    'django.contrib.sessions',# session回話管理框架模塊
    'django.contrib.messages',# 消息隊列處理模塊
    'django.contrib.staticfiles',# 項目靜態(tài)文件管理模塊
]

我們要做的是什么呢,打開模塊應(yīng)用polls/app.py應(yīng)用描述文件香缺,可以看到里面定義了模塊應(yīng)用的名稱手销,對,說的就是它M颊拧7嫱稀U┖贰!

from django.apps import AppConfig
# 模塊應(yīng)用的名稱
class PollsConfig(AppConfig):
    name = 'polls'

我們修改mysite/mysite/settings.py配置文件兽埃,添加模塊應(yīng)用

INSTALLED_APPS = [
    'polls.apps.PollsConfig',
    'django.contrib.admin',# 默認(rèn)提供的后臺管理網(wǎng)站
    'django.contrib.auth',# 權(quán)限認(rèn)證模塊
    'django.contrib.contenttypes',#內(nèi)容編碼框架模塊
    'django.contrib.sessions',# session回話管理框架模塊
    'django.contrib.messages',# 消息隊列處理模塊
    'django.contrib.staticfiles',# 項目靜態(tài)文件管理模塊
]

至此~配置部分就完全OK啦

3.3. 使用模型對象

上面項目部分開發(fā)配置完成后侥钳,我們Django能做什么呢?

  • 自動創(chuàng)建模塊應(yīng)用中模型對應(yīng)的數(shù)據(jù)表(Create Table <table_name>)
  • 自動生成訪問Question和Choice模型對象的API接口

這么神奇柄错?上干貨:
執(zhí)行如下命令舷夺,進(jìn)行數(shù)據(jù)庫同步:

python3 manage.py makemigrations polls

執(zhí)行的結(jié)果你會看到:

makemigrations執(zhí)行結(jié)果

運行makemigrations命令,就是告訴Django我們對指定的模型售貌,如polls给猾,進(jìn)行了什么改變,并將這些改變信息存儲起來

migrations會將這些改變信息保存在模塊應(yīng)用的migraions文件夾下颂跨,如上面的操作會生成這樣一個文件:mysite/polls/migrations/0001_initial.py敢伸,打開直接就可以看到具體的描述信息了。

我們再填一把火毫捣,查看Django自動給我們創(chuàng)建的SQL語句吧

# 執(zhí)行sqlmigrate命令得到剛才執(zhí)行makemigrations命令生成的sql語句
python3 manage.py sqlmigrate polls 0001

執(zhí)行結(jié)果如下:

D:\resp_work\PY_WORK\mysite>python3 manage.py sqlmigrate polls 0001
BEGIN;
--
-- Create model Choice
--
CREATE TABLE `polls_choice` (
`id` integer AUTO_INCREMENT NOT NULL PRIMARY KEY,
`choice_text` varchar(200) NOT NULL,
`votes` integer NOT NULL);
--
-- Create model Question
--
CREATE TABLE `polls_question` (
`id` integer AUTO_INCREMENT NOT NULL PRIMARY KEY,
`question_text` varchar(200) NOT NULL,
`pub_date` datetime(6) NOT NULL);
--
-- Add field question to choice
--
ALTER TABLE `polls_choice` ADD COLUMN `question_id` integer NOT NULL;

ALTER TABLE `polls_choice`
ADD CONSTRAINT `polls_choice_question_id_c5b4b260_fk_polls_question_id`
FOREIGN KEY (`question_id`) REFERENCES `polls_question` (`id`);

COMMIT;

我們會看到一個很神奇的結(jié)果详拙,我們創(chuàng)建的Question和Choice模型數(shù)據(jù),被Django自動轉(zhuǎn)換成了SQL語句了

注意問題:由migrations引發(fā)的臆想

  • 由makemigrations根據(jù)模型自動生成的sql語句蔓同,嚴(yán)重依賴指定的數(shù)據(jù)庫饶辙,切記這樣的SQL不是通用的,這里生成的SQL語句只能用于MySQL數(shù)據(jù)庫
  • 主鍵是自動增長的(當(dāng)然你也可以修改不讓自動增長)斑粱,并且會根據(jù)指定的數(shù)據(jù)庫自動匹配弃揽,如auto_increment(MySQL)serial(PostgreSQL)则北、integer primary key autoincrement(SQLite)等等
  • 默認(rèn)情況下Django會自動給外鍵增加_id的形式命名(同樣可以修改哦)
  • 最重要的是:makemigrations或者sqlmigrate命令矿微,都不會在目標(biāo)數(shù)據(jù)庫自動執(zhí)行,也就是SQL語句有了尚揣,但是還沒有執(zhí)行涌矢。這是為什么呢?因為畢竟自動的東西不一定滿足需要~我們簡單修改一下SQL然后執(zhí)行快骗,這樣更加符合實際開發(fā)哦
  • 當(dāng)然娜庇,如果不需要修改SQL,直接執(zhí)行的話方篮,運行python3 manage.py migrate命令就可以將改動應(yīng)用到數(shù)據(jù)庫了
3.4. 使用模型對象的API操作

在命令行通過shell啟動應(yīng)用名秀,就可以直接進(jìn)行python根據(jù)模型應(yīng)用提供的API接口的訪問測試了
執(zhí)行如下命令:

python3 manage.py shell

就可以在命令行中,進(jìn)行API的測試了

D:\resp_work\PY_WORK\mysite>python3 manage.py shell
Python 3.6.1 (v3.6.1:69c0db5, Mar 21 2017, 18:41:36) [MSC v.1900 64 bit (AMD64)] on win32
Type "help", "copyright", "credits" or "license" for more information.
(InteractiveConsole)
>>> Question.objects.all()
Traceback (most recent call last):
  File "<console>", line 1, in <module>
NameError: name 'Question' is not defined
>>>
>>> from polls.models import Question, Choice
>>> Question.objects.all()# 查看所有的問題對象列表
<QuerySet []>
>>>
>>> from django.utils import timezone # 引入時區(qū)模塊
>>> q = Question(question_text="What's new?", pub_date=timezone.now())# 創(chuàng)建一個問題對象
>>> q.save() # 保存到數(shù)據(jù)庫
>>> q.id # 查看q對象的主鍵字段
1
>>> q.question_text# 查看q對象的問題描述字段
"What's new?"
>>> q.pub_date # 查看q對象的發(fā)布時間字段
datetime.datetime(2017, 6, 9, 2, 59, 43, 68178, tzinfo=<UTC>)
>>>
>>> q.question_text="What's up?" # 修改q對象的question_text屬性值
>>> q.save()# 保存
>>>
>>> Question.objects.all() #查看所有的問題對象列表
<QuerySet [<Question: Question object>]>
>>>

未完待續(xù):5.3. 后臺管理系統(tǒng)


Django來敲門
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末藕溅,一起剝皮案震驚了整個濱河市匕得,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌巾表,老刑警劉巖汁掠,帶你破解...
    沈念sama閱讀 218,546評論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件略吨,死亡現(xiàn)場離奇詭異,居然都是意外死亡考阱,警方通過查閱死者的電腦和手機(jī)晋南,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,224評論 3 395
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來羔砾,“玉大人,你說我怎么就攤上這事偶妖〗啵” “怎么了?”我有些...
    開封第一講書人閱讀 164,911評論 0 354
  • 文/不壞的土叔 我叫張陵趾访,是天一觀的道長态秧。 經(jīng)常有香客問我,道長扼鞋,這世上最難降的妖魔是什么申鱼? 我笑而不...
    開封第一講書人閱讀 58,737評論 1 294
  • 正文 為了忘掉前任,我火速辦了婚禮雄嚣,結(jié)果婚禮上以舒,老公的妹妹穿的比我還像新娘蔓纠。我一直安慰自己,他們只是感情好匣砖,可當(dāng)我...
    茶點故事閱讀 67,753評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著昏滴,像睡著了一般猴鲫。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上谣殊,一...
    開封第一講書人閱讀 51,598評論 1 305
  • 那天拂共,我揣著相機(jī)與錄音,去河邊找鬼姻几。 笑死宜狐,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的鲜棠。 我是一名探鬼主播肌厨,決...
    沈念sama閱讀 40,338評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼豁陆!你這毒婦竟也來了柑爸?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,249評論 0 276
  • 序言:老撾萬榮一對情侶失蹤盒音,失蹤者是張志新(化名)和其女友劉穎表鳍,沒想到半個月后馅而,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,696評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡譬圣,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,888評論 3 336
  • 正文 我和宋清朗相戀三年瓮恭,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片厘熟。...
    茶點故事閱讀 40,013評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡屯蹦,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出绳姨,到底是詐尸還是另有隱情登澜,我是刑警寧澤,帶...
    沈念sama閱讀 35,731評論 5 346
  • 正文 年R本政府宣布飘庄,位于F島的核電站脑蠕,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏跪削。R本人自食惡果不足惜谴仙,卻給世界環(huán)境...
    茶點故事閱讀 41,348評論 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望碾盐。 院中可真熱鬧晃跺,春花似錦、人聲如沸毫玖。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,929評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽孕豹。三九已至涩盾,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間励背,已是汗流浹背春霍。 一陣腳步聲響...
    開封第一講書人閱讀 33,048評論 1 270
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留叶眉,地道東北人址儒。 一個月前我還...
    沈念sama閱讀 48,203評論 3 370
  • 正文 我出身青樓,卻偏偏與公主長得像衅疙,于是被迫代替她去往敵國和親莲趣。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,960評論 2 355

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