為學(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.sqlite3
、django.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)用只是項目中的一部分,我們只有通過類似編制的東東讓項目mysite
給polls
添加一個編制源祈,項目就可以處理模塊應(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)