返回介绍

Models

发布于 2025-02-27 00:22:12 字数 4938 浏览 0 评论 0 收藏 0

现今的网站,都不再只是仅单纯展示网页内容的静态网页。大多数网站,都会加上一些与使用者互动的功能,如留言版、讨论区、投票等等。而这些使用者产出的资料,往往会储存于资料库中。

这一章,你会学到如何利用 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
  • 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 定义以下属性:
属性资料型态说明参数
titleCharField标题max_length=100 -- 标题不可以超过 100 个字元
contentTextField内文blank=True -- 非必填栏位(表单验证时使用),预设所有栏位都是 blank=False
photoURLField照片网址同 content,非必填栏位
locationCharField地点同 title
created_atDateTimeField建立时间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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文