译者:刘志军
原文:http://t.cn/REmBa06
本文是系列文章的第二篇,大家跟着节奏来,暂时没时间做的先收藏,学生朋友找工作可以写进项目经验,没有公司会要0项目经验的
前言
欢迎来到 Django 教程的第二节,在第一节中,我们安装了项目所需要的一切,希望你安装的是 Python3.6,并且在虚拟环境中运行 Django1.11,这节课我们继续在项目上编写代码。
开始写代码前,咱们先讨论项目的相关背景知识,然后再学习 Django 的基础,包括:模型、管理后台、视图、模板和路由
动手吧!
论坛项目
我不知道你是怎样认为的,个人觉得,通过看实际例子和代码片段可以学到东西,但就我个人而言,当你在例子中读到诸如 和 这样的代码,或者看到诸如 这样的例子时,是很难解释清楚这些概念的,所以,我不想让你这样做。
所以,在进入模型,视图等其它有趣的部分之前,先让我们花点时间,简要地讨论我们将要开发的这个项目。
如果你已经有了 Web 开发的经验并且觉得它太繁琐了,那么你可以浏览一下图片以了解我们将要构建的内容,然后直接跳转到本教程的模型部分。
但是如果你对 Web 开发不熟悉,我强烈建议你继续阅读下去。我将为你提供关于Web应用程序建模和设计上的一些见解。Web开发和软件开发可不仅仅只是编码。
用例图
我们的项目是一个论坛系统,整个项目的构思是维护几个论坛版块(boards),每个版块就像一个分类一样。在指定的版块里面,用户可以通过创建新主题(Topic)开始讨论,其他用户参与讨论回复。
我们需要找到一种方法来区分普通用户和管理员用户,因为只有管理员可以创建版块。下图概述了主要的用例和每种类型的用户角色:
图1:核心功能用例图
类图
从用例图中,我们可以开始思考项目所需的实体类有哪些。这些实体就是我们要创建的模型,它与我们的Django应用程序处理的数据非常密切。
为了能够实现上面描述的用例,我们需要至少实现下面几个模型:Board,Topic,Post和User。
图2:类图
Board:版块
Topic:主题
Post:帖子(译注:其实就是主题的回复或评论)
花点时间考虑模型之间如何相互关联也很重要。
类与类之间的实线告诉我们,在一个主题(Topic)中,我们需要有一个字段(译注:其实就是通过外键来关联)来确定它属于哪个版块(Board)。
同样,帖子(Post)也需要一个字段来表示它属于哪个主题,这样我们就可以列出在特定主题内创建的帖子。
最后,我们需要一个字段来表示主题是谁发起的,帖子是谁发的。
用户和版块之间也有联系,就是谁创建的版块。但是这些信息与应用程序无关。还有其他方法可以跟踪这些信息,稍后你会看到。
现在我们的类图有基本的表现形式,我们还要考虑这些模型将承载哪些信息。这很容易让事情变得复杂,所以试着先把重要的内容列出来,这些内容是我们启动项目需要的信息。后面我们再使用 Django 的迁移(Migrations)功能来改进模型,你将在下一节中详细了解这些内容。
但就目前而言,这是模型最基本的内容:
图3:强调类(模型)之间关系的类图
这个类图强调的是模型之间的关系,这些线条和箭头最终会在稍后转换为字段。
对于Board模型,我们将从两个字段开始:name 和 description。 name字段必须是唯一的,为了避免有重复的名称。description 用于说明这个版块是做什么用的。
Topic模型包括四个字段:subject 表示主题内容,last_update 用来定义话题的排序,starter 用来识别谁发起的话题,board 用于指定它属于哪个版块。
Post模型有一个 message 字段,用于存储回复的内容,created_at 在排序时候用(最先发表的帖子排最前面),updated_at 告诉用户是否更新了内容,同时,还需要有对应的 User 模型的引用,Post 由谁创建的和谁更新的。
最后是 User 模型。在类图中,我只提到了字段 username,password,email, is_superuser 标志,因为这几乎是我们现在要使用的所有东西。
需要注意的是,我们不需要创建 User 模型,因为Django已经在contrib包中内置了User模型,我们将直接拿来用。
关于类图之间的对应关系(数字 1,0..* 等等),这里教你如何阅读:
一个topic 必须与一个(1)Board(这意味着它不能为空)相关联,但是 Board 下面可能与许多个或者0个 topic 关联 (0..*)。这意味着 Board 下面可能没有主题。(译注:一对多关系)
一个 Topic 至少有一个 Post(发起话题时,同时会发布一个帖子),并且它也可能有许多 Post(1..*)。一个Post 必须与一个并且只有一个Topic(1)相关联。
一个 Topic 必须有一个且只有一个 User 相关联,topic 的发起者是(1)。而一个用户可能有很多或者没有 topic(0..*)。
Post 必须有一个并且只有一个与之关联的用户,用户可以有许多或没有 Post(0..*)。Post 和 User之间的第二个关联是直接关联(参见该行最后的箭头),就是 Post 可以被用户修改(updated_by),updated_by 有可能是空(Post 没有被修改)
画这个类图的另一种方法是强调字段而不是模型之间的关系:
图4:强调类(模型)与属性(字段)的类图
上面的表示方式与前面的表示方式是对等的,不过这种方式更接近我们将要使用 Django Models API 设计的内容。在这种表示方式中,我们可以更清楚地看到,在 Post 模型中,关联了 Topic,created_by(创建者)和 updated_by(更新者)字段。
另一个值得注意的事情是,在 Topic 模型中,有一个名为 的操作(一个类方法)。我们将通过反向关系来实现这一目标,Django 将自动在数据库中执行查询以返回特定主题的所有帖子列表。
好了,现在已经够UML了!为了绘制本节介绍的图表,我使用了 StarUML 工具。
线框图(原型图)
花了一些时间来设计应用程序的模型后,我喜欢创建一些线框来定义需要完成的工作,并且清楚地了解我们将要做什么。
基于线框图,我们可以更深入地了解应用程序中涉及的实体。
首先,我们需要在主页上显示所有版块:
图5:论坛项目线框主页列出所有可用的版块
如果用户点击一个链接,比如点击Django版块,它应该列出所有Django相关的主题:
图6:论坛项目线框图列出了Django版块中的所有主题
这里有两个入口:用户点击“new topic“ 按钮创建新主题,或者点击主题链接查看或参与讨论。
“new topic” 页面:
现在,主题页面显示了帖子和讨论:
如果用户点击回复按钮,将看到下面这个页面,并以倒序的方式(最新的在第一个)显示帖子列表:
绘制这些线框,你可以使用draw.io服务,它是免费的。
总结
这节我们设计的系统的模型,以及模型之间的关系,分清楚了不同用户类型的角色,最后,我们把原型图也画出来了。再小的系统,我们也要先思考。下一节,我们将设计 Model 类。
领取专属 10元无门槛券
私享最新 技术干货