Advertisement

Django搭建个人博客之编写博客文章的Model模型

阅读量:

写在前面

Django 框架的核心关注点在于模型(Model)、模板(Template)以及视图(Views),这一体系被统称为MTV架构。

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

其基本原理是Model用于获取数据, View负责选择需要调用的数据集,并Template主要处理如何呈现这些数据。

数据库与模型

该系统通过智能算法实现了高效的数据处理功能,并支持多种数据类型的存储与检索操作。
该系统通过智能算法实现了高效的数据处理功能,并支持多种数据类型的存储与检索操作。

该系统通过智能算法实现了高效的数据处理功能,并支持多种数据类型的存储与检索操作。
该系统通过智能算法实现了高效的数据处理功能,并支持多种数据类型的存储与检索操作。

该系统通过智能算法实现了高效的数据处理功能,并支持多种数据类型的存储与检索操作。
该系统通过智能算法实现了高效的数据处理功能,并支持多种数据类型的存储与检索操作。

该系统通过智能算法实现了高效的数据处理功能,并支持多种数据类型的存储与检索操作。
该系统通过智能算法实现了高效的数据处理功能,并支持多种数据类型的存储与检索操作。

该系统通过智能算法实现了高效的数据处理功能,并支持多种数据类型的存储与检索操作。
该系统通过智能算法实现了高效的数据处理功能,并支持多种数据类型的存储与检索操作。

同学们,请问您们在讨论什么?举例来说,在我们三年级二班中的学生们的花名册被称为数据表。有些花名册记录了每位同学的考试分数;有些则测量并存储了学生的体格数据;还有一些则收集了他们的兴趣爱好信息。将这些花名册全部存放于老师的办公桌抽屉里。

通常情况下,默认的数据库是db.sqlite3这个文件建立的。当网站上线时可能会考虑更换其他数据库;然而目前我们无需涉及这一话题。

进行数据库操作所使用的SQL语句具有高度复杂性;它本质上与Python这种语言有根本性的区别;这对于初次学习编程的人来说确实存在一定的挑战性。

幸运的是,在Django中构建Web应用程序时,并不需要直接处理数据库事务。相反,在 Django 中创建一个应用程序通常包括三个步骤:首先是创建一个用于存储数据的应用实例;其次是定义好(在Django中创建一个应用实例通常包括选择使用的后端数据库以及设置相应的配置参数)。在这个过程中,在Django中创建一个应用实例通常包括选择使用的后端数据库以及设置相应的配置参数)。在Django中创建一个应用程序通常包括选择使用的后端数据库以及设置相应的配置参数);然后是根据需求选择合适的数据库表单;最后是根据需求选择合适的数据库表单;最后是根据需求选择合适的数据库表单);然后是根据需求选择合适的数据库表单;最后是根据需求选择合适的数据库表单);然后是根据需求选择合适的数据库表单;最后是根据需求选择合适的数据库表单);然后是根据需求选择合适的数据库表单;最后是根据需求选择合适的数据库表单);然后是根据需求选择合适的数据库表单;最后是根据需求选择合适的 databases table names and fields)。这个过程相对繁琐但效率较高

它实际上有一个专门的术语被称为对象关系映射$...$(即... Object Relational Mapping...简称ORM),旨在完成不同系统间的无缝连接。

编写Model.py

如前所述,在 Django 中通过将 Django 模型利用映射机制连接至数据库系统中进行管理,并实现对数据的一系列操作流程。

在博客网站运营中,文章内容为核心数据。为此,建议首先进行存储结构设计为文章信息的数据模型构建。

打开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将处理的数据类型。
      这种设置不仅明确了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管理界面中通常表现为对象的数据展示值。因此必须总是返回一个易于理解和友好的字符串。
  • 数学公式...原样保留。
  • 英文原样保留。
  • 本段落应以粗体开头并使用下划线分隔开。
    • 第一部分详细说明了如何配置排序参数。
    • 第二部分讨论了字符串表示的重要性及其在实际应用中的表现形式。
    • 最后部分强调了代码块和注释在文档构建中的关键作用。

整理并去掉注释,全部代码放在一起是这样:

复制代码
    article/models.py
    
    from django.db import models
    from django.contrib.auth.models import User
    from django.utils import timezone
    
    class ArticlePost(models.Model):
    author = models.ForeignKey(User, on_delete=models.CASCADE)
    title = models.CharField(max_length=100)
    body = models.TextField()
    created = models.DateTimeField(default=timezone.now)
    updated = models.DateTimeField(auto_now=True)
    
    class Meta:
        ordering = ('-created',)
    
    def __str__(self):
        return self.title
    
    
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
    
    代码解释

恭喜你,你已经完成了博客网站最核心的数据模型的大部分内容

代码不到20行,是不是完全没啥感觉。后面会慢慢体会Django的强大。

抄还是敲?

学习本教程时,代码部分直接拷贝还是纯手敲?

直接拷贝的长处是学习速度很快。掌握原理后,在自己的项目中导入代码只需快速操作。这意味着学习者需要较高的自我约束力:达到何种程度才算真正理解?但需要注意的是,在实际应用中可能会遇到各种问题。

通过纯键盘输入的方式可以有效规避这一问题。然而需要注意的是,在进行键盘输入时必须保持注意力集中以确保效率不受影响。想要提高速度也难以如愿,在实践中经常遇到各种软件错误(bugs)。通过反思并改正自身的一些不良操作习惯来提升效率

  • 架构规模较小且数量有限的模型和视图是重点学习内容。
    • 模板基于个人需求时, 建议先适当参考或模仿现有的模板结构。

视图、模板马上就会讲到。

代码分解

这部分内容不能理解也没关系,先跳过,待水平提高再回过头来阅读。

模块导入
Django 框架建立在 Python 语言之上,在 Python 中可以通过 import 或者 from...import 的方式来进行模块导入。

模块本质上是一些函数和类的汇集文件。它们能够实现相应功能。当需要调用这些功能时,请直接将相关的模块导入到我们的程序中进行调用。

导入语句用于引入整个功能模块。然而在实际操作中通常只需调用某个特定的功能。\ 因此直接引入全部内容显得有些浪费。\ 可以使用语法结构'from a import b'来实现从a模块中仅引入b组件的需求。


Python作为一种面向对象编程语言。其核心概念包括类(Class)和实例(Instance)。

类作为抽象模板,在软件设计中被广泛使用。实例作为对象实例,则是由该模板生成的具体实体或结构化数据集合。每一个具体实例都具备相同的基础功能模块集合,并通过这些基础功能模块集合实现其特定的功能特性与行为特征。这些基础功能模块集合则被整合组合并进行了系统性优化处理后共同构成了一个完整的类结构。

例如,在开发过程中我们刚编写了一个 ArticlePost 类别,在线博客文章内容提供了一个模板系统。每当有新的文章生成时,在线系统会基于 ArticlePost 类自动生成 `author, title, body 等等字段,并用 $变量 表示待填充的数据;尽管每篇文章的内容可能不同但都需要遵循统一的标准和流程

Django中,数据由模型来处理,而模型的载体就是类(Class)

字段field代表该数据库表的抽象类结构,在Django框架中,默认实现了将Python数据类型与数据库对象进行关联的功能。

在模型中,在类中定义了一个字段,并将其作为标识特定的数据库表进行处理;此外,在对象初始化阶段还会执行将字段值映射到数据库中的相关操作

例如,在ArticlePost类里有一个名为title的属性;这个属性用于存储一种叫做Charfield的数据类型的信息:即一种长度有限的文本内容。

foreign key
数据库中有多种类型的数据表。通常情况下,多张表格之间会存在关联关系。例如,在一张表格中记录所有的文章,在另一张表格中记录所有的用户,并且每篇文章都是由某个用户发布内容,则这两张表格之间就会建立关联。

ForeignKey是用来解决“一对多”关系的。那什么又叫“一对多”?

在我们的ArticlePost模型中

又例如在一个班级中的学生群体中 每位学生都只具有单一的性别特征 而同一种别则能够对应众多的学生个体 这也体现了'一对多'的关系

由此可见,在使用ForeignKey字段后,在线学习平台能够建立课程与教师之间的联系;从而实现了课程发布者与在线教育机构之间高效的知识交流。

由于存在一母多子模式(OneToOneField)、一母一子模式(ManyToOneField)以及群群对应模式(ManyToOne.ManyToManyField)等外键关系,在当前项目中无需应用这类外键关系。以后有机会再深入探讨它们之间的异同点。

在Django 2.0之前的早期版本中,默认情况下外键关联关系中的on_delete参数无需指定;而在Django 2.0之后,则必须明确设置该参数作为必填项。

核心组件
核心组件中的class Meta负责模型的元数据。元数据代表所有非字段的信息,例如排序选项ordering、数据库表名db_table、单数与复数名称verbose_name和 verbose_name_plural。这些信息作为整张表统一规范的基础信息而非某一篇特定文章的数据。

要不考虑是否必要编写内部类?即使编写了内部类也能帮助更好地理解并规范类的行为。

Withinthe ArticlePost, we employ an order setting withinthe metadata, specifically $ordering = ('-created',), which signifies that whenever I require retrieving a list of articles forthe blog homepage, these will be sorted through -created, indicatingthe creation time (negative sign denoting descending order), ensuring that the most recent articles consistently appear at the top of the list.

数据迁移(Migrations)

完成搭建Model后, 随后就需要实施数据迁移. 数据传输是 Django 对模型修改传递至数据库的过程.

在对数据库执行任何修改操作(包括添加、修改或删除)时,请确保执行数据迁移。

Django 的迁移代码是基于模型文件自动生成的。该系统本质上只是一个历史记录。通过使用滚动更新功能进行数据管理。从而实现与其现有数据架构的有效整合。

切换到虚拟环境中访问位于my_blog/目录下的文件夹(如果您尚未了解如何配置虚拟环境,请参考:How to Set Up a Django Development Environment on Windows)。运行Python管理指令生成新的数据迁移表:执行模型修改操作以建立新的数据迁移表:

复制代码
    (env) e:\django_project\my_blog>python manage.py makemigrations
    Migrations for 'article':
      article\migrations\0001_initial.py
    - Create model ArticlePost
    
    (env) e:\django_project\my_blog>
    
    
      
      
      
      
      
      
    
    代码解释

通过执行 makemigrations 命令,在 Django 中会识别并记录你对模型文件所做的任何修改,并将这些修改内容以一次形式进行保存。

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

复制代码
    (env) e:\django_project\my_blog>python manage.py migrate
    Operations to perform:
      Apply all migrations: admin, article, auth, contenttypes, sessions
    Running migrations:
      Applying contenttypes.0001_initial... OK
      ...
      Applying sessions.0001_initial... OK
    
    (env) e:\django_project\my_blog>
    
    
      
      
      
      
      
      
      
      
      
    
    代码解释

选择尚未被应用的迁移并将其通过migrate命令施加于数据库中, 也就是将模型更新同步至数据库架构. 迁移这一功能极为强大, 它能够让你在开发过程中持续地修改数据库架构而不必删除或创建表. 其核心目标是确保数据在顺利升级过程中不会发生丢失.

有点拗口,也有点枯燥,坚持。乐趣在后面。

再强调一遍:每当修改了models.py$文件时, 必须使用makemigrationsmigrate这两个命令来迁移数据

在迁移之后,Model的编写就算完成了。

总结

本章对Django中的MV模式进行了入门学习,并开发了博客文章的ArticlePost模型,并将其迁移到数据库中。

下一步就向View进军,学习如何调取模型中的数据。

全部评论 (0)

还没有任何评论哟~