返回博客

创建 Django 模型:教程

创建 Django 模型:教程

Django 是一个著名的 Web 框架,用于快速开发安全且易于维护的网站和 Web 应用程序。它基于 Python 构建,简化了 Web 开发,让开发者能够将更多的时间和精力集中在编写应用程序上,而无需每次都重复造轮子。Django 是一个免费且开源的项目,拥有完善的官方文档、强大的社区支持以及丰富的免费和付费支持。

在本指南中,我们将深入探讨如何创建 Django 模型。 在 Django 中,模型 是关于数据的关键信息源。模型描述了要存储的数据的字段和行为。Django 使用模型通过 ORM(对象关系映射)生成数据库表,这些表也被称为模型。

前提条件

我们使用的是基于 Unix 的操作系统,首选 Ubuntu 20.04 云服务器 作为我们测试过的系统。如果您想在类似的环境中设置 Django,请参考我们的教程:“如何在 Ubuntu 20.04 上安装 Django 并设置开发环境.”

步骤 1. Python 开发环境

Django 是基于 Python 构建的。因此,我们需要一个强大的 Python 开发环境,其中包含处理 Python 应用程序所需的所有工具。我们已经在专属指南中讨论过这一点。在这里,我们将进行简短的演示。

首先,打开终端并运行以下命令:

接下来,安装 pip – Python 包管理器:

然后,安装一些额外的开发包:

Django Models 1

为了建立虚拟环境,我们还需要 Python 的 venv 模块:

步骤 2. 安装 MySQL 服务器

MySQL 是一款流行的关系型数据库管理系统。它开源、稳定且功能丰富。我们将使用 MySQL 作为我们 Django 应用程序的数据库服务器。使用 APT 安装 MySQL:

接下来,验证安装:

Django Models 2

这只是使用默认选项的 MySQL 基础安装。请查看关于 MySQL 安装和配置.

步骤 3. 设置 Django 应用程序

我们现在准备好创建我们的 Django 应用程序了。如果您对 Django 的进一步深入演示感兴趣,请参考我们的教程:“在 Ubuntu 20.04 上安装 Django Web 框架.”

接下来,为该应用程序创建一个专属目录。目录名称应反映项目名称:

在项目目录下,使用 venv 模块创建一个 Python 虚拟环境:

激活虚拟环境:

Django Models 3

使用 pip:

接下来,使用 django-admin 命令创建一个新的 Django 项目:

django-admin

步骤 4. 配置 Django 应用程序

Django 应用程序包含所有默认配置。为了实现我们的目标,我们需要进行一些调整。

首先编辑配置文件 settings.py:

然后,更改时区:

TIME_ZONE

添加允许访问 Django 应用程序服务器的机器:

ALLOWED_HOSTS

之后,应用更改:

Django Models 4

最后,为我们的 Django Web 应用程序创建一个超级用户:

python manage.py

步骤 5. 将 Django 应用连接到 MySQL

要连接到 MySQL,我们需要一个与 Django 兼容的额外 Python 连接器库。我们将使用 mysqlclient.

首先,确保我们已经安装了必要的包:

python3-dev

接下来,安装 mysqlclient:

  • 创建专用数据库

对于我们的应用,我们需要创建一个专用的数据库和数据库用户。以 root:

sudo mysql -u root为我们的 Django 应用创建一个专用数据库:

然后,为 Django 应用创建一个专用数据库用户:

最后,授予该专用用户对专用数据库的完全权限:

GRANT ALL ON
  • 更改 Django 配置以使用 MySQL

现在,我们需要调整一些 Django 配置,以便它可以使用 MySQL 作为数据库服务器。在文本编辑器中打开 settings.py

向下滚动到 DATABASES 部分并粘贴以下代码:

DATABASES

接下来,编辑 MySQL 配置文件,使其包含必要的数据库凭据:

在文件末尾添加以下块:

Django Models 5

重启 MySQL 以使更改生效:

步骤 6. 创建 Django 模型

我们现在准备在 Django 项目中创建一个新模型。激活虚拟环境:

在此位置,让 Django 创建一个新应用:

创建后,文件树应该类似于这样。在这里,文件 models.py 将包含我们自定义 Django 模型的代码:

Django Models 6

检查文件的当前内容:

cat models.py

为了进行演示,我们将为博客文章创建一个名为 Post 的模型。它将包含以下字段:

  • title:博客文章标题。
  • slug:存储并生成网页的有效 URL。
  • content:博客文章正文。
  • created_on:文章创建日期。
  • author:创建文章的用户。

在文本编辑器中打开文件 models.py

让我们为模型导入一些必要的 API。默认情况下,它会导入 models API。我们还需要用于生成 slug 的 slugify API,用于身份验证的 User,以及用于更好、更灵活地创建 URL 的 reverse

接下来,添加名为 Post 的类方法。它将包含必要的数据库字段,例如 title, slug, content, created_on,author:

我们需要用于生成 URL 和保存文章的功能。这很重要,因为它会生成与唯一文章相匹配的唯一链接:

下一部分将告诉模型如何对文章进行排序并在网页上显示。我们将使用一个内部类来编写该逻辑,即 Meta。它将包含与数据库字段定义无关的其他模型逻辑:

最后,我们将在此文件中添加 Comment 模型功能。这需要添加另一个类 Comment,使用 models.Model 作为其签名。它将包含以下数据库字段:

  • name: 评论者的姓名。
  • email: 评论者的电子邮件地址。
  • text: 评论本身的内容。
  • post: 发表该评论的文章。
  • created_on: 评论创建的时间。

代码看起来会像这样:

此时,我们的 models.py 文件将如下所示:

models.py

最后,保存文件并关闭编辑器。

步骤 7. 更新 Django 设置

模型已创建。但是,我们需要调整一些配置文件以使模型生效。在 settings.py 中,我们需要将模型添加到 INSTALLED_APPS.

打开 settings.py(在文本编辑器中):

在以下部分下注册新模块:INSTALLED_APPS:

INSTALLED_APPS

保存文件并关闭编辑器。

步骤 8. 迁移更改

现在我们已经添加了所有需要的模型,下一步是应用这些更改。Django 将把这些模式应用到我们的 MySQL 数据库中。

以下命令将生成所有必需的迁移文件。输出将显示项目目录中所有这些文件的位置:

makemigrations

以下命令将列出所有现有的迁移:

Django Models 6

请注意,除了 0001_initial 之外,所有迁移都已标记,该迁移是作为以下模型的一部分创建的:PostComment.

以下命令将显示 Django 将执行什么 SQL 查询来进行迁移:

sample_app

现在我们只需要应用迁移。这些迁移将把更改写入数据库:

migrate

步骤 9. 验证更改

要验证更改,让我们查看一下我们的 MySQL 数据库。以 Django 用户身份启动 MySQL shell:

接下来,将当前活动数据库更改为 Django 应用程序数据库:

列出数据库中的所有表:

最后,要查看任何表的内容,请使用 DESCRIBE 查询:

Django Models 7

Django 在 MySQL 中的局限性

将 MySQL 用作 Django 应用程序的数据库服务器时,需要注意以下几点:

  • 对于涉及模式修改的过程,事务支持非常有限。这意味着,如果迁移失败,在尝试另一次迁移之前,需要手动撤销所有更改。无法回滚到失败迁移发生之前的较早时间点。
  • 对于大多数模式修改过程,MySQL 会完全重写表。在某些情况下,这可能会非常耗时。在最坏的情况下,时间复杂度将与要添加的行数或要删除的列数成正比。根据 Django 官方文档,每百万行可能需要一分钟。
  • MySQL 对列、表和索引的名称长度强制执行字符限制。对所有列和索引覆盖的总大小也有限制。Django 的要求可能会超出该限制。除 MySQL 之外的一些其他后端可以处理 Django 更高的限制。

这就是为什么强烈建议您权衡选择并选择合适方案的原因。

结语

本指南成功演示了如何向现有的 Django 应用程序添加模块。我们使用 MySQL 作为该应用程序的后端。它还展示了一些关键的 Django 概念,例如模型、迁移的工作原理,以及 Django 如何将模型转换为 MySQL 数据库表。

祝您编程愉快!

author

Hark Labs

作者 · CloudSigma

Preslav Dobrev 是 CloudSigma 的创意设计师,专注于通过传统和创新营销渠道打造一致的企业形象。他擅长将艺术愿景与战略营销相融合,创造具有影响力的品牌叙事。

评论

暂无评论。发表第一条评论吧。