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 应用程序所需的所有工具。我们已经在专属指南中讨论过这一点。在这里,我们将进行简短的演示。
首先,打开终端并运行以下命令:
|
1 2 |
$ sudo apt update && sudo apt upgrade -y $ sudo apt install python3 python-is-python3 |
接下来,安装 pip – Python 包管理器:
|
1 |
$ sudo apt install python3-pip |
然后,安装一些额外的开发包:
|
1 |
$ sudo apt install build-essential libssl-dev libffi-dev python3-dev |
为了建立虚拟环境,我们还需要 Python 的 venv 模块:
|
1 |
$ sudo apt install python3-venv |
步骤 2. 安装 MySQL 服务器
MySQL 是一款流行的关系型数据库管理系统。它开源、稳定且功能丰富。我们将使用 MySQL 作为我们 Django 应用程序的数据库服务器。使用 APT 安装 MySQL:
|
1 |
$ sudo apt install mysql-server |
接下来,验证安装:
|
1 |
$ systemctl status mysql |
这只是使用默认选项的 MySQL 基础安装。请查看关于 MySQL 安装和配置.
步骤 3. 设置 Django 应用程序
我们现在准备好创建我们的 Django 应用程序了。如果您对 Django 的进一步深入演示感兴趣,请参考我们的教程:“在 Ubuntu 20.04 上安装 Django Web 框架.”
接下来,为该应用程序创建一个专属目录。目录名称应反映项目名称:
|
1 |
$ mkdir -pv <project_dir> |
在项目目录下,使用 venv 模块创建一个 Python 虚拟环境:
|
1 |
$ python3 -m venv <virtual_env_name> |
激活虚拟环境:
|
1 |
$ . sample_app_env/bin/activate |
使用 pip:
|
1 |
$ pip install django |
接下来,使用 django-admin 命令创建一个新的 Django 项目:
|
1 |
$ django-admin startproject sample_app |
步骤 4. 配置 Django 应用程序
Django 应用程序包含所有默认配置。为了实现我们的目标,我们需要进行一些调整。
首先编辑配置文件 settings.py:
|
1 |
$ nano sample_app/sample_app/sample_app/settings.py |
然后,更改时区:
|
1 |
$ TIME_ZONE = '<time_zone>' |
添加允许访问 Django 应用程序服务器的机器:
|
1 |
$ ALLOWED_HOSTS = ['<allowed_host_ip_or_domain_name >'] |
之后,应用更改:
|
1 |
$ python manage.py migrate |
最后,为我们的 Django Web 应用程序创建一个超级用户:
|
1 |
$ python manage.py createsuperuser |
步骤 5. 将 Django 应用连接到 MySQL
要连接到 MySQL,我们需要一个与 Django 兼容的额外 Python 连接器库。我们将使用 mysqlclient.
首先,确保我们已经安装了必要的包:
|
1 |
$ sudo apt install python3-dev libmysqlclient-dev default-libmysqlclient-dev |
接下来,安装 mysqlclient:
|
1 |
$ pip install mysqlclient |
- 创建专用数据库
对于我们的应用,我们需要创建一个专用的数据库和数据库用户。以 root:
|
1 |
$ sudo mysql -u root |
|
1 |
$ CREATE DATABASE <dedicated_database>; |
然后,为 Django 应用创建一个专用数据库用户:
|
1 |
$ CREATE USER '<username>'@'%' IDENTIFIED WITH mysql_native_password BY '<user_password>'; |
最后,授予该专用用户对专用数据库的完全权限:
|
1 |
$ GRANT ALL ON <database>.* TO '<username'@'%'; |
- 更改 Django 配置以使用 MySQL
现在,我们需要调整一些 Django 配置,以便它可以使用 MySQL 作为数据库服务器。在文本编辑器中打开 settings.py:
|
1 |
$ nano settings.py |
向下滚动到 DATABASES 部分并粘贴以下代码:
|
1 2 3 4 5 6 7 8 |
DATABASES = { 'default': { 'ENGINE': 'django.db.backends.mysql', 'OPTIONS': { 'read_default_file': '/etc/mysql/my.cnf', }, } } |
接下来,编辑 MySQL 配置文件,使其包含必要的数据库凭据:
|
1 |
$ sudo nano /etc/mysql/my.cnf |
在文件末尾添加以下块:
|
1 2 3 4 5 |
[client] database = <dedicated_database> user = <dedicated_user> password = <user_password> default-character-set = utf8 |
重启 MySQL 以使更改生效:
|
1 2 |
$ sudo systemctl daemon-reload $ sudo systemctl restart mysql |
步骤 6. 创建 Django 模型
我们现在准备在 Django 项目中创建一个新模型。激活虚拟环境:
|
1 2 3 |
$ cd sample_app/ $ . sample_app_env/bin/activate $ cd sample_app/ |
在此位置,让 Django 创建一个新应用:
|
1 |
$ python manage.py startapp <new_app> |
创建后,文件树应该类似于这样。在这里,文件 models.py 将包含我们自定义 Django 模型的代码:
检查文件的当前内容:
|
1 |
$ cat models.py |
为了进行演示,我们将为博客文章创建一个名为 Post 的模型。它将包含以下字段:
title:博客文章标题。slug:存储并生成网页的有效 URL。content:博客文章正文。created_on:文章创建日期。author:创建文章的用户。
在文本编辑器中打开文件 models.py:
|
1 |
$ nano models.py |
让我们为模型导入一些必要的 API。默认情况下,它会导入 models API。我们还需要用于生成 slug 的 slugify API,用于身份验证的 User,以及用于更好、更灵活地创建 URL 的 reverse:
|
1 2 3 4 |
from django.db import models from django.template.defaultfilters import slugify from django.contrib.auth.models import User from django.urls import reverse |
接下来,添加名为 Post 的类方法。它将包含必要的数据库字段,例如 title, slug, content, created_on, 和 author:
|
1 2 3 4 5 6 |
class Post(models.Model): title = models.CharField(max_length=255) slug = models.SlugField(unique=True, max_length=255) content = models.TextField() created_on = models.DateTimeField(auto_now_add=True) author = models.TextField() |
我们需要用于生成 URL 和保存文章的功能。这很重要,因为它会生成与唯一文章相匹配的唯一链接:
|
1 2 3 4 5 6 7 |
def get_absolute_url(self): return reverse('blog_post_detail', args=[self.slug]) def save(self, *args, **kwargs): if not self.slug: self.slug = slugify(self.title) super(Post, self).save(*args, **kwargs) |
下一部分将告诉模型如何对文章进行排序并在网页上显示。我们将使用一个内部类来编写该逻辑,即 Meta。它将包含与数据库字段定义无关的其他模型逻辑:
|
1 2 3 4 5 |
class Meta: ordering = ['created_on'] def __unicode__(self): return self.title |
最后,我们将在此文件中添加 Comment 模型功能。这需要添加另一个类 Comment,使用 models.Model 作为其签名。它将包含以下数据库字段:
- name: 评论者的姓名。
- email: 评论者的电子邮件地址。
- text: 评论本身的内容。
- post: 发表该评论的文章。
- created_on: 评论创建的时间。
代码看起来会像这样:
|
1 2 3 4 5 6 7 |
class Comment(models.Model): name = models.CharField(max_length=42) email = models.EmailField(max_length=75) website = models.URLField(max_length=200, null=True, blank=True) content = models.TextField() post = models.ForeignKey(Post, on_delete=models.CASCADE) created_on = models.DateTimeField(auto_now_add=True) |
此时,我们的 models.py 文件将如下所示:
最后,保存文件并关闭编辑器。
步骤 7. 更新 Django 设置
模型已创建。但是,我们需要调整一些配置文件以使模型生效。在 settings.py 中,我们需要将模型添加到 INSTALLED_APPS.
打开 settings.py(在文本编辑器中):
|
1 |
$ nano settings.py |
在以下部分下注册新模块:INSTALLED_APPS:
保存文件并关闭编辑器。
步骤 8. 迁移更改
现在我们已经添加了所有需要的模型,下一步是应用这些更改。Django 将把这些模式应用到我们的 MySQL 数据库中。
以下命令将生成所有必需的迁移文件。输出将显示项目目录中所有这些文件的位置:
|
1 |
$ python manage.py makemigrations |
以下命令将列出所有现有的迁移:
|
1 |
$ python manage.py showmigrations |
请注意,除了 0001_initial 之外,所有迁移都已标记,该迁移是作为以下模型的一部分创建的:Post 和 Comment.
以下命令将显示 Django 将执行什么 SQL 查询来进行迁移:
|
1 |
$ python manage.py sqlmigrate random_app 0001_initial |
现在我们只需要应用迁移。这些迁移将把更改写入数据库:
|
1 |
$ python manage.py migrate |
步骤 9. 验证更改
要验证更改,让我们查看一下我们的 MySQL 数据库。以 Django 用户身份启动 MySQL shell:
|
1 |
$ mysql sample_app_data -u sample_app_user |
接下来,将当前活动数据库更改为 Django 应用程序数据库:
|
1 |
$ USE <django_dedicated_database>; |
列出数据库中的所有表:
|
1 |
$ SHOW TABLES; |
最后,要查看任何表的内容,请使用 DESCRIBE 查询:
|
1 2 |
$ DESCRIBE random_app_comment; $ DESCRIBE random_app_post; |
Django 在 MySQL 中的局限性
将 MySQL 用作 Django 应用程序的数据库服务器时,需要注意以下几点:
- 对于涉及模式修改的过程,事务支持非常有限。这意味着,如果迁移失败,在尝试另一次迁移之前,需要手动撤销所有更改。无法回滚到失败迁移发生之前的较早时间点。
- 对于大多数模式修改过程,MySQL 会完全重写表。在某些情况下,这可能会非常耗时。在最坏的情况下,时间复杂度将与要添加的行数或要删除的列数成正比。根据 Django 官方文档,每百万行可能需要一分钟。
- MySQL 对列、表和索引的名称长度强制执行字符限制。对所有列和索引覆盖的总大小也有限制。Django 的要求可能会超出该限制。除 MySQL 之外的一些其他后端可以处理 Django 更高的限制。
这就是为什么强烈建议您权衡选择并选择合适方案的原因。
结语
本指南成功演示了如何向现有的 Django 应用程序添加模块。我们使用 MySQL 作为该应用程序的后端。它还展示了一些关键的 Django 概念,例如模型、迁移的工作原理,以及 Django 如何将模型转换为 MySQL 数据库表。
祝您编程愉快!






















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