创建 django 博客应用

在上一章节中我们创建了 django 博客的工程,并且成功地运行了它。然而这一切都是 django 为我们创建的项目初始内容,django 不可能为我们初始化生成我们需要的博客代码,这些功能性代码都得由我们自己编写。

django 鼓励我们把自己编写的代码组织到应用(Application)里,并且最好是一个应用只提供一个功能。例如我们要开发的 django 博客,相关的代码都放在博客这个应用里。其实应用没什么复杂的,不过是把功能相关的代码放到一个文件夹里,这个文件夹就成了一个应用(姑且可以这样理解)。我们可以在 django 工程目录下手动地建立一个文件夹,为它取个名字,并且告诉 django 说这是一个应用。但是我们不必做这些无聊的工作,dango 已经为我们提供了自动创建应用的命令。现在就来创建我们的 django 博客应用,我把它命名为 blog,进入虚拟环境,切换到 manage.py 文件所在的目录下,运行下面的命令:

前面已经说过,manage.py 是我们的工程管理助手,上一章中我们使用了它的 runserver 命令开启了一个本地开发服务器,这里我们使用它的 startapp 命令创建了一个 blog 应用。

用资源管理器打开 manage.py 文件所在的目录,可以看到多了一个名为 blog 的文件夹,它下面的文件结构像这样:

不同名称的文件用于存放特定功能的代码,这些将会在后面详细介绍。总之这个应用的文件夹结构 django 已经为我们建立好了,但目前它还只是包含各种文件的一个文件夹而已,django 并不知道这是一个应用,我们得告诉 django 这是我们创建的应用,专业一点说就是:在 django 的配置文件中注册这个应用。打开 blogproject 目录下的 settings.py 文件,看名字就知道 settings.py 是一个设置文件(setting 意为设置),找到 INSTALLED_APPS 设置项,将 blog 添加进去。

可以看到 django 已经为我们提供了一些内置的应用,这些应用为我们提供了各种各样的功能,这就是 django 强大的地方,通用的功能它都帮我们写好了,我们只需编写与自身业务相关的功能代码。

编写博客的数据库模型

博客最主要的功能就是展示我们写的文章,它需要从某个地方获取我们写的博客文章数据才能把它展示出来,通常来说这个地方就是数据库。我们把写好的文章永久地保存在数据库里,当用户访问我们的博客时,django 就去数据库里把这些数据取出来展现给用户。

博客的文章应该含有标题、正文、作者、发表时间等数据,一个更加现代化的博客文章我们也希望它有分类、标签、评论等。为了更好地存储这些数据,我们需要合理地组织我们数据库的结构。

我们的博客初级版本主要包含这些数据:博客文章,文章会有分类以及标签。一篇文章只能有一个分类,但可以打上很多标签。数据库存储的数据其实就是表格的形式,例如存储我们的博客文章的数据库表长这个样子:

其中 id 是一个数字,唯一对应着一篇文章。当然还可以在列上加入更多的信息,这只是一个最基本的示例。

数据库表设计成这样其实已经可以了,但是稍微分析一下我们就会发现一个问题,这 3 篇文章的分类和标签都是相同的,这会产生很多重复数据,当数据量很大时就浪费了存储空间。不同的文章可能它们的分类或者标签是相同的,所以我们把分类和标签拿出来,做成单独的数据库表,再把文章和分类与标签关联起来就可以了。下面分别是分类和标签的数据库表:

以上是自然语言描述的表格,数据库也和编程语言一样,有它自己的一套规定的语法来生成上述的表格结构,这样我们才能把数据存进去。一般情况下这时候我们应该先去学习数据库创建表格的语法,再回来写我们的博客程序了。但是 django 跟我们说不用这么麻烦,我已经帮你做了一些事情,我把那一套数据库的语法转换成了 Python 的语法形式,你写你的 Python 代码就可以了,翻译的工作我来帮你。用更加专业一点的说法,就是 django 为我们提供了一套 ORM(Object Relational Mapping)系统。比如说我们的分类数据库表,django 只要求我们这样写:

这就是一个标准的 Python 的类,我们继承了 models.Model 类,类名为 Category(分类),Category 类有一个属性 name,它是 models.CharField 的一个实例。这样,django 就可以把这个类翻译成数据库的语法,在数据库里创建一个名为 category 的表格,这个表格的一个列名为 name(即分类名),还有一个列 id 则会自动帮我们创建。其规则就是一个 Python 类对应一个数据库表格,类名即表名,类的属性对应着表格的列,属性名即列名。我们需要 3 个表格:文章(Post)、分类(Category)以及标签(Tag),下面就来创建它们。已经在代码中做了详细的注释,说明每一句代码的含义。但如果你在移动端下阅读不便的话,也可以跳到代码后面看正文的里的讲解。

数据库模型详解

首先是 Category(分类)和 Tag(标签)类,它们均继承自 model.Model 类,这是 django 规定的。它们均有一个 name 属性,用来存储它们的名称。由于分类名和标签名一般都是用字符串表示,因此我们使用了 CharField 来指定 name 的数据类型,同时 max_length 参数则指定 name 的最大长度。除了 CharField ,django 还为我们提供了更多内置的数据类型,比如时间类型 DateTimeField、整数类型 IntegerField 等等。在本教程中我们会教你这些类型的使用方法,但以后你开发自己的项目时,你就需要通过阅读 django 的官方文档关于字段类型的介绍来了解有哪些数据类型以及如何使用它们。
Post(文章)类也一样,必须继承自 model.Model 类。文章的数据库表稍微复杂一点,主要是列更多。我们为它指定了这些列:

title。这是文章的标题,数据类型是 CharField,最大长度 max_length = 70。
body。文章正文,我们使用了 TextField。比较短的字符串存储可以使用 CharField,但对于文章的正文来说可能会是一大段文本,因此使用 TextField 来存储大段文本。
created_time、modified_time。这两个列分表表示了文章的创建时间和最后一次修改时间,存储时间的列用 DateTimeField 数据类型
excerpt。文章摘要,可以没有文章摘要,但默认情况下 CharField 要求我们必须存入数据,否则就会报错。指定 blank=True 后就可以允许空值了。
category 和 tags。这是分类与标签,分类与标签的模型我们已经定义在上面。我们在这里把文章对应的数据库表和分类与标签对应的表关联起来,但是关联形式稍微有点不同。我们规定一篇文章只能对应一个分类,但是一个分类下可以有很多篇文章,所以我们使用的是 ForeignKey,即一对多的关系。而对于标签来说,一篇文章可以有多个标签,同一个标签下也可能有多篇文章,所以我们使用 ManyToManyField,表明这是多对多的关系。同时我们规定文章可以没有标签,因此为标签 tags 指定了 blank=True。
author。文章作者,这里 User 是从 django.contrib.auth.models 导入的。django.contrib.auth 是 django 内置的应用,专门用于处理网站用户的注册、登录等流程,User 是 django 为我们已经写好的用户模型,这里我们通过 ForeignKey 把文章和 User 关联起来,因为我们规定一篇文章只能有一个作者,而一个作者可能会写多篇文章,因此这是一对多的关系,和 Category 类似。

注:这里我们使用了两种关联数据库表的形式,一种是 ForeignKey,它表明一种一对多的关联。比如这里我们的文章和分类的关系,一篇文章只能对应一个分类,而一个分类下可以有多篇文章。另外一中是 ManyToManyField,看名字就知道这是一种多对多的关联关系,比如这里的文章和标签,一篇文章可以有多个标签,而一个标签下也可以有多篇文章。假如你对此有一些困惑,强烈建议阅读官方文档对这两种关系的说明以及更多官方的例子以加深理解。

原文发布时间为:2017-04-22
本文作者:追梦人物
本文来自云栖社区合作伙伴“Python中文社区”,了解相关信息可以关注“Python中文社区”微信公众号

Django 博客教程(三):创建应用和编写数据库模型相关推荐

  1. Django3.0+Python3.8+MySQL8.0 个人博客搭建三|创建博客项目

    文章目录 一.安装 Django 二.创建项目 Pycharm 三.运行效果 四.命令行创建Django项目 教程目录 一.安装 Django 在虚拟环境fswy中安装django (fswy) xx ...

  2. Django 博客开发教程 6 - 真正的 Django 博客首页视图

    在此之前我们已经编写了 Blog 的首页视图,并且配置了 URL 和模板,让 Django 能够正确地处理 HTTP 请求并返回合适的 HTTP 响应.不过我们仅仅在首页返回了一句话:欢迎访问我的博客 ...

  3. django orm级联_第 03 篇:创建 Django 博客的数据库模型

    HelloGitHub-Team 成员--追梦人物 设计博客的数据库表结构 博客最主要的功能就是展示我们写的文章,它需要从某个地方获取博客文章数据才能把文章展示出来,通常来说这个地方就是数据库.我们把 ...

  4. Django搭建简易博客教程(四)-Models

    原文链接: http://www.jianshu.com/p/dbc4193b4f95 Django Model 每一个Django Model都继承自django.db.models.Model 在 ...

  5. Django 博客开发教程 8 - 博客文章详情页

    首页展示的是所有文章的列表,当用户看到感兴趣的文章时,他点击文章的标题或者继续阅读的按钮,应该跳转到文章的详情页面来阅读文章的详细内容.现在让我们来开发博客的详情页面,有了前面的基础,开发流程都是一样 ...

  6. django博客项目8:文章详情页

    首页展示的是所有文章的列表,当用户看到感兴趣的文章时,他点击文章的标题或者继续阅读的按钮,应该跳转到文章的详情页面来阅读文章的详细内容.现在让我们来开发博客的详情页面,有了前面的基础,开发流程都是一样 ...

  7. 创建hugo博客_如何创建您的第一个Hugo博客:实用指南

    创建hugo博客 Hugo is a great tool to use if you want to start a blog. 如果您想创建博客,Hugo是一个很好的工具. I use Hugo ...

  8. CakePHP 2.x十分钟博客教程

    1. CakePHP2十分钟博客教程(一):安装与配置 Cakephp 2.0依然保持着Cakephp框架的各种优良传统,其中之一就是非常易于新手入门,几乎不做任何复杂的配置即可使用.非常可惜的是,C ...

  9. 如何启动 WordPress 博客 – 简易指南 – 创建博客(2021)

    您想以正确的方式创建 WordPress 博客吗?我们知道,特别是当您不是技术极客时,创建博客可能是一个复杂的想法.在帮助许多用户创建博客后,我们决定创建最全面的指南,介绍如何在没有任何技术知识的情况 ...

最新文章

  1. Go 学习笔记(43)— Go 标准库之 os/exec(执行外部命令、非阻塞等待、阻塞等待、命令输出)
  2. C++运算符重载形式--成员函数or友元函数?
  3. ​Nessus更新到8.9.1
  4. 一文详解SVM的Soft-Margin机制
  5. DSP学习 -- 软件开机自启动
  6. oracle参数文件initorcl位置,oracle 参数文件详解
  7. Lync Server外部访问系列PART6:启用外部访问
  8. java 怎么从性能上优化代码_月薪上万做好这一步:程序员职场中必须掌握的的Java代码性能优化技巧...
  9. pythonopencv人脸相似度_图像相似度算法的个人见解(pythonopencv)-Go语言中文社区...
  10. 如何建立自己的工作库,把分散信息有效整理?
  11. chm 转 html 带索引,chm 的项目文件中包含创建 chm 文件所需的HTML文件信息、目录表文件信息、索引文件信息、窗口属 - 试题答案网问答...
  12. 大数据分析方法管不管用
  13. nim3取石子游戏 (威佐夫博弈)
  14. 057 生成器和生成器表达式
  15. Nsight中给工程添加include目录
  16. Photoshop插件-删除所有亮度通道蒙板-脚本开发-PS插件
  17. jsp遍历List map
  18. Qt学习之解决linux下qt构建出现cannot find -lGL的问题
  19. UNIX环境高级编程(APUE)读书笔记
  20. Microsoft OLE DB Provider for ODBC Drivers 错误 '80004005'解决方案

热门文章

  1. CTF-MISC杂项题2
  2. 在matlab中使用spm8,在matlab中同时使用spm2,spm5,spm8
  3. 物理不突出能学计算机吗,物理成绩不突出,高中选科怎么办?3个理由让你解除后顾之忧!...
  4. vue 判断两对象是否一致_你的.vue文件就已经是你的文档了
  5. 计算机存储技术及应用,计算机数据安全存储技术及应用
  6. php rar_PHP: rar:// - Manual
  7. php 其他页面获取session_PHP五十个提升执行效率的小技巧,和常见问题
  8. netty java开发文档_Netty简明教学文档
  9. Uvaoj 10048 - Audiophobia(Floyd算法变形)
  10. 使用物理硬盘_硬盘坏道的几种非专业修复方法介绍