現(xiàn)今的網(wǎng)站,都不再只是僅單純展示網(wǎng)頁內(nèi)容的靜態(tài)網(wǎng)頁。大多數(shù)網(wǎng)站,都會加上一些與使用者互動的功能,如留言版、討論區(qū)、投票...等。而這些使用者產(chǎn)出的資料,往往會儲存于資料庫中。
這一章,你會學(xué)到如何利用 Django Model 定義資料庫的結(jié)構(gòu) ( Schema ),并透過 Django 指令創(chuàng)建資料庫、資料表及欄位。
雖然資料庫的語法有其標(biāo)準(zhǔn),但是各家資料庫還是或多或少有差異。使用 Django Model 的來操作資料庫的優(yōu)點之一,就是資料庫轉(zhuǎn)換相當(dāng)方便。
在大部份情況下,不再需要為不同的資料庫,使用不同語法來撰寫程式。只要修改設(shè)定,就可以輕易地從 SQLite 轉(zhuǎn)換到 MySQL、PostgreSQL、或是 Oracle...等等。
為了開發(fā)方便,我們使用 Django 預(yù)設(shè)的資料庫 SQLite
。打開 mysite/settings.py
,看看 DATABASES
的設(shè)定。它應(yīng)該長得像下面這樣:
# mysite/settings.py
...
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.sqlite3',
'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
}
}
在這裡我們設(shè)定了資料庫連線的預(yù)設(shè)值:
ENGINE -- 你要使用的資料庫引擎,例如:
MySQL
: django.db.backends.mysqlSQLite 3
: django.db.backends.sqlite3PostgreSQL
: django.db.backends.postgresql_psycopg2
如果你使用 MySQL 或 PostgreSQL 等等資料庫的話,可能還要設(shè)定它的位置、名稱、使用者等等。不過我們這裡使用的 SQLite 3 不需要這些性質(zhì),所以可以省略。
我們在 trips/models.py 宣告一個Post
物件,并定義裡面的屬性,而 Django 會依據(jù)這個建立資料表,以及資料表裡的欄位設(shè)定:
# trips/models.py
from django.db import models
class Post(models.Model):
title = models.CharField(max_length=100)
content = models.TextField(blank=True)
photo = models.URLField(blank=True)
location = models.CharField(max_length=100)
created_at = models.DateTimeField(auto_now_add=True)
Django 預(yù)設(shè)會為每一個 Model 加上 id
欄位 (型態(tài)為 auto-incrementing primary key),并且 每一筆資料的 id 都會是獨(dú)一無二的。
為 Post 定義以下屬性:
屬性 | 資料型態(tài) | 說明 | 參數(shù) |
---|---|---|---|
title | CharField | 標(biāo)題 | max_length=100 -- 標(biāo)題不可以超過 100 個字元 |
content | TextField | 內(nèi)文 | blank=True -- 非必填欄位(表單驗證時使用),預(yù)設(shè)所有欄位都是 blank=False
|
photo | URLField | 照片網(wǎng)址 | 同 content,非必填欄位 |
location | CharField | 地點 | 同 title |
created_at | DateTime | 建立時間 | auto_now_add=True -- 物件新增的時間
p.s. 若想設(shè)成物件修改時間,則用 auto_now=True
|
Model fields :可為 Django Model 定義不同型態(tài)的屬性。
CharField -- 字串欄位,適合像 title、location 這種有長度限制的字串。
TextField -- 合放大量文字的欄位
URLField -- URL 設(shè)計的欄位
DateTimeField -- 日期與時間的欄位,使用時會轉(zhuǎn)成 Pythondatetime
型別
更多 Model Field 與其參數(shù),請參考 Django 文件
(VENV) ~/djangogirls/mysite$ python manage.py migrate
Operations to perform:
Synchronize unmigrated apps: trips
Apply all migrations: contenttypes, sessions, admin, auth
Synchronizing apps without migrations:
Creating tables...
Creating table trips_post
Installing custom SQL...
Installing indexes...
Running migrations:
Applying contenttypes.0001_initial... OK
Applying auth.0001_initial... OK
Applying admin.0001_initial... OK
Applying sessions.0001_initial... OK
migrate 指令會根據(jù)INSTALLED_APPS
的設(shè)定,按照 app 順序建立或更新資料表,將你在 models.py 裡的更新跟資料庫同步。
如果你不是第一次執(zhí)行migrate
,在此之前需要先執(zhí)行 makemigrations:
(VENV) ~/djangogirls/mysite$ python manage.py makemigrations
Migrations for 'trips':
0001_initial.py:
- Create model Post
這個指令會根據(jù)你對 Model 的修改刪除建立一個新的 migration 檔案,讓migrate
指令執(zhí)行時,可以照著這份紀(jì)錄更新資料庫。
(VENV) ~/djangogirls/mysite$ python manage.py migrate
python manage.py migrate
Operations to perform:
Apply all migrations: auth, admin, contenttypes, sessions, trips
Running migrations:
Applying trips.0001_initial... OK
更多建議: