[学习:Django搭建个人博客 2]编写博客文章的Model模型

496 阅读5分钟

参考:Django搭建个人博客:编写博客文章的Model模型

Django 框架主要关注的是模型(Model)、模板(Template)和视图(Views),称为MTV模式

它们各自的职责如下:

层次职责
模型(Model),即数据存取层处理与数据相关的所有事务: 如何存取、如何验证有效性、包含哪些行为以及数据之间的关系等。
模板(Template),即业务逻辑层处理与表现相关的决定: 如何在页面或其他类型文档中进行显示。
视图(View),即表现层存取模型及调取恰当模板的相关逻辑。模型与模板的桥梁。

简单来说就是Model存取数据,View决定需要调取哪些数据,而Template则负责将调取出的数据以合理的方式展现出来。

在 Django 里写一个数据库驱动的 Web 应用的第一步是定义模型Model,也就是数据库结构设计和附加的其它元数据。

模型包含了储存的数据所必要的字段和行为。Django 的目标是你只需要定义数据模型,其它的杂七杂八代码你都不用关心,它们会自动从模型生成。

编写Model

如前面所讲,Django中通常一个模型(Model)映射一个数据库,处理与数据相关的事务。

对博客网站来说,最重要的数据就是文章。所以首先来建立一个存放文章的数据模型。

打开article/models.py文件,输入如下代码:

article/models.py

from django.db import models
# 导入内建的User模型。
from django.contrib.auth.models import User
# timezone 用于处理时间相关事务。
from django.utils import timezone

# 博客文章数据模型
class ArticlePost(models.Model):
    # 文章作者。参数 on_delete 用于指定数据删除的方式,避免两个关联表的数据不一致。
    author = models.ForeignKey(User, on_delete=models.CASCADE)

    # 文章标题。models.CharField 为字符串字段,用于保存较短的字符串,比如标题
    title = models.CharField(max_length=100)

    # 文章正文。保存大量文本使用 TextField
    body = models.TextField()

    # 文章创建时间。参数 default=timezone.now 指定其在创建数据时将默认写入当前的时间
    created = models.DateTimeField(default=timezone.now)

    # 文章更新时间。参数 auto_now=True 指定每次数据更新时自动写入当前时间
    updated = models.DateTimeField(auto_now=True)
  • 每个模型被表示为 django.db.models.Model 类的子类。
  • 每个模型有一些类变量,它们都表示模型里的一个数据库字段。
  • 每个字段都是 Field 类的实例。比如字符字段被表示为 CharField ,日期时间字段被表示为 DateTimeField。这将告诉 Django 每个字段要处理的数据类型。
  • 定义某些 Field 类实例需要参数。例如 CharField 需要一个 max_length参数。这个参数的用处不止于用来定义数据库结构,也用于验证数据。
  • 使用 ForeignKey 定义一个关系。这将告诉 Django,每个(或多个) ArticlePost 对象都关联到一个 User 对象。Django本身具有一个简单完整的账号系统(User),足以满足一般网站的账号申请、建立、权限、群组等基本功能。

ArticlePost 类定义了一篇文章所必须具备的要素:作者、标题、正文、创建时间以及更新时间。我们还可以额外再定义一些内容,规范 ArticlePost 中数据的行为。加入以下代码:

article/models.py

...

class ArticlePost(models.Model):
    ...
    
    # 内部类 class Meta 用于给 model 定义元数据
    class Meta:
    	# ordering 指定模型返回的数据的排列顺序
    	# '-created' 表明数据应该以倒序排列
        ordering = ('-created',)

    # 函数 __str__ 定义当调用对象的 str() 方法时的返回值内容
    def __str__(self):
    	# return self.title 将文章标题返回
        return self.title

内部类 Meta 中的 ordering 定义了数据的排列方式。 -created 表示将以创建时间的倒序排列,保证了最新的文章总是在网页的最上方。注意 ordering 是元组,括号中只含一个元素时不要忘记末尾的逗号。
__str__方法定义了需要表示数据时应该显示的名称。给模型增加 __str__方法是很重要的,它最常见的就是在Django管理后台中做为对象的显示值。因此应该总是返回一个友好易读的字符串。

数据迁移

编写好了Model后,接下来就需要进行数据迁移。

迁移是Django对模型所做的更改传递到数据库中的方式。因此每当对数据库进行了更改(添加、修改、删除等)操作,都需要进行数据迁移。

Django 的迁移代码是由你的模型文件自动生成的,它本质上只是个历史记录,Django 可以用它来进行数据库的滚动更新,通过这种方式使其能够和当前的模型匹配。

输入 python manage.py makemigrations ,对模型的更改创建新的迁移表。

通过运行 makemigrations 命令,Django 会检测你对模型文件的修改,并且把修改的部分储存为一次迁移。

然后输入python manage.py migrate,应用迁移到数据库中。

migrate 命令选中所有还没有执行过的迁移并应用在数据库上,也就是将模型的更改同步到数据库结构上。迁移是非常强大的功能,它能让你在开发过程中持续的改变数据库结构而不需要重新删除和创建表。它专注于使数据库平滑升级而不会丢失数据。