Models
Models
现今的网站,都不再只是仅单纯展示网页内容的静态网页。大多数网站,都会加上一些与使用者互动的功能,如留言版、讨论区、投票...等。而这些使用者产出的资料,往往会储存于资料库中。
这一章,你会学到如何利用 Django Model 定义资料库的结构 ( Schema ),并透过 Django 指令创建资料库、资料表及栏位。
使用 Django Model 的好处
虽然资料库的语法有其标准,但是各家资料库还是或多或少有差异。使用 Django Model 的来操作资料库的优点之一,就是资料库转换相当方便。
在大部份情况下,不再需要为不同的资料库,使用不同语法来撰写程式。只要修改设定,就可以轻易地从 SQLite 转换到 MySQL、PostgreSQL、或是 Oracle...等等。
设定资料库
为了开发方便,我们使用 Django 预设的资料库 SQLite
。打开 mysite/settings.py
,看看 DATABASES
的设定。它应该长得像下面这样:
# mysite/settings.py
...
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.sqlite3',
'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
}
}
在这裡我们设定了资料库连线的预设值:
-
ENGINE -- 你要使用的资料库引擎,例如:
MySQL
: django.db.backends.mysqlSQLite 3
: django.db.backends.sqlite3-
PostgreSQL
: django.db.backends.postgresql_psycopg2 - NAME -- 你的资料库名称
如果你使用 MySQL 或 PostgreSQL 等等资料库的话,可能还要设定它的位置、名称、使用者等等。不过我们这裡使用的 SQLite 3 不需要这些性质,所以可以省略。
Django Models
我们在 trips/models.py 宣告一个Post
物件,并定义裡面的属性,而 Django 会依据这个建立资料表,以及资料表裡的栏位设定:
# 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 预设会为每一个 Model 加上
id
栏位 (型态为 auto-incrementing primary key),并且 每一笔资料的 id 都会是独一无二的。 -
为 Post 定义以下属性:
属性 | 资料型态 | 说明 | 参数 |
---|---|---|---|
title | CharField | 标题 | max_length=100 -- 标题不可以超过 100 个字元 |
content | TextField | 内文 | blank=True -- 非必填栏位(表单验证时使用),预设所有栏位都是 blank=False
|
photo | URLField | 照片网址 | 同 content,非必填栏位 |
location | CharField | 地点 | 同 title |
created_at | DateTime | 建立时间 | auto_now_add=True -- 物件新增的时间
p.s. 若想设成物件修改时间,则用 auto_now=True
|
Model fields :可为 Django Model 定义不同型态的属性。
-
CharField -- 字串栏位,适合像 title、location 这种有长度限制的字串。
-
TextField -- 合放大量文字的栏位
-
URLField -- URL 设计的栏位
-
DateTimeField -- 日期与时间的栏位,使用时会转成 Python
datetime
型别
更多 Model Field 与其参数,请参考 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 指令会根据INSTALLED_APPS
的设定,按照 app 顺序建立或更新资料表,将你在 models.py 裡的更新跟资料库同步。
如果你不是第一次执行migrate
,在此之前需要先执行 makemigrations:
(VENV) ~/djangogirls/mysite$ python manage.py makemigrations
Migrations for 'trips':
0001_initial.py:
- Create model Post
这个指令会根据你对 Model 的修改删除建立一个新的 migration 档案,让migrate
指令执行时,可以照著这份纪录更新资料库。
(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
更多建议: