Models
现今的网站,都不再只是仅单纯展示网页内容的静态网页。大多数网站,都会加上一些与使用者互动的功能,如留言版、讨论区、投票等等。而这些使用者产出的资料,往往会储存于资料库中。
这一章,你会学到如何利用 Django Model 定义资料库的结构(schema),并透过 Django 指令创建资料库、资料表及栏位。
使用 Django Model 的好处
虽然资料库的语法有其标准,但是各家资料库还是或多或少有差异。使用 Django Model 的来操作资料库的优点之一,就是 资料库转换相当方便 。
在大部份情况下,不再需要为不同的资料库,使用不同语法来撰写程式。只要修改设定,就可以轻易地从 SQLite 转换到 MySQL、PostgreSQL、或是 Oracle 等等。
设定资料库
为了开发方便,我们使用 Python 预设的资料库引擎 - 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.mysql
- SQLite 3:
django.db.backends.sqlite3
- PostgreSQL:
django.db.backends.postgresql_psycopg2
- MySQL:
- 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
栏位,并将这个栏位设成 primary key(主键),简称 pk ,让每一笔资料都会有一个独一无二的 ID。 - 为 Post 定义以下属性:
属性 | 资料型态 | 说明 | 参数 |
---|---|---|---|
title | CharField | 标题 | max_length=100 -- 标题不可以超过 100 个字元 |
content | TextField | 内文 | blank=True -- 非必填栏位(表单验证时使用),预设所有栏位都是 blank=False |
photo | URLField | 照片网址 | 同 content,非必填栏位 |
location | CharField | 地点 | 同 title |
created_at | DateTimeField | 建立时间 | auto_now_add=True -- 物件新增的时间。若想设成物件修改时间,则用 auto_now=True |
Model fields 可为 Django Model 定义不同型态的属性。
- CharField -- 字串栏位 ,适合像 title、location 这种有长度限制的字串。
- TextField -- 合放大量文字的栏位
- URLField -- URL 设计的栏位
- DateTimeField -- 日期与时间的栏位 ,使用时会转成 Python
datetime
型别。
更多 Model Field 与其参数,请参考 Django 文件
同步资料库
首先执行 makemigrations
指令:
(djangogirls_venv) ~/djangogirls/mysite$ python manage.py makemigrations
Migrations for 'trips':
0001_initial.py:
- Create model Post
这个指令会根据你对 Model 的修改删除建立一个新的 migration 档案 ,让 migrate
指令执行时,可以照著这份纪录更新资料库。
接著用以下的指令,让 Django 根据上面的纪录,把 models.py
中的栏位写入资料库:
(djangogirls_venv) ~/djangogirls/mysite$ python manage.py migrate
结果应该类似下面这样:
Operations to perform:
Synchronize unmigrated apps: staticfiles, messages
Apply all migrations: sessions, admin, auth, contenttypes
Synchronizing apps without migrations:
Creating tables...
Running deferred SQL...
Installing custom SQL...
Running migrations:
Rendering model states... DONE
Applying contenttypes.0001_initial... OK
Applying auth.0001_initial... OK
Applying admin.0001_initial... OK
Applying contenttypes.0002_remove_content_type_name... OK
Applying auth.0002_alter_permission_name_max_length... OK
Applying auth.0003_alter_user_email_max_length... OK
Applying auth.0004_alter_user_username_opts... OK
Applying auth.0005_alter_user_last_login_null... OK
Applying auth.0006_require_contenttypes_0002... OK
Applying sessions.0001_initial... OK
Applying trips.0001_initial... OK
migrate
指令会根据 INSTALLED_APPS
的设定,按照 app 顺序建立或更新资料表,将你在 models.py 裡的更新跟资料库同步。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论