创建 Django 博客的数据库模型
设计博客的数据库表结构
博客最主要的功能就是展示文章,它需要从某个地方获取博客文章数据才能把文章展示出来,通常来说这个地方就是数据库。把写好的文章永久地保存在数据库里,当用户访问博客时,Django 就去数据库里把这些数据取出来展现给用户。
博客的文章应该含有标题、正文、作者、发表时间等数据。一个更加现代化的博客文章还希望它有分类、标签、评论等。为了更好地存储这些数据,需要合理地组织数据库的表结构。
本例博客初级版本主要包含博客文章,文章会有分类以及标签。一篇文章只能有一个分类,但可以打上很多标签。
数据库存储的数据其实就是表格的形式,例如存储博客文章的数据库表长这个样子:
id 标题 正文 发表时间 分类 标签
1 title1 text1 2017-2-23 Django 学习
2 title2 text2 2016-3-24 Django 学习
3 title3 text3 2016-2-26 Python Python 学习
其中文章 ID 是一个数字,唯一对应着一篇文章。当然还可以有更多的列以存储更多相关数据,这只是一个最基本的示例。
数据库表设计成这样其实已经可以了,但是稍微分析一下就会发现一个问题,这 3 篇文章的分类和标签都是相同的,这会产生很多重复数据,当数据量很大时就浪费了存储空间。
不同的文章可能它们对应的分类或者标签是相同的,所以我们把分类和标签提取出来,做成单独的数据库表,再把文章和分类、标签关联起来。下面分别是分类和标签的数据库表:
分类id 分类名
1 Django
2 Python
标签id 标签名
1 学习
2 Python 学习
编写博客模型代码
以上是自然语言描述的表格,数据库也和编程语言一样,有它自己的一套规定的语法来生成上述的表结构,这样才能把数据存进去。一般来说这时候应该先去学习数据库创建表格的语法,再回来写 Django 博客代码。但是 Django 告诉我们不用这么麻烦,它已经帮我们做了一些事情。Django 把那一套数据库的语法转换成了 Python 的语法形式,只要写 Python 代码就可以了,Django 会把 Python 代码翻译成对应的数据库操作语言。用更加专业一点的说法,就是 Django 为我们提供了一套 ORM(Object Relational Mapping)系统。
例如分类数据库表,Django 只要求这样写:
Category就是一个标准的 Python 类,它继承了models.Model类,类名为Category。Category类有一个属性name,它是models.CharField的一个实例。
这样,Django 就可以把这个类翻译成数据库的操作语言,在数据库里创建一个名为 category 的表格,这个表格的一个列名为 name,还有一个列 id。Django 则会自动创建。可以看出从 Python 代码翻译成数据库语言时其规则就是一个 Python 类对应一个数据库表格,类名即表名,类的属性对应着表格的列,属性名即列名。
我们需要 3 个表格:文章(Post)、分类(Category)以及标签(Tag),下面就来分别编写它们对应的 Python 类: