Models

2020-06-15 17:41 更新

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.mysql
  • SQLite 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 -- 日期与时间的栏位,使用时会转成 Pythondatetime型别

更多 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
以上内容是否对您有帮助:
在线笔记
App下载
App下载

扫描二维码

下载编程狮App

公众号
微信公众号

编程狮公众号