django2.0博客教程(创建 Django 博客的数据库模型)

设计博客的数据库表结构

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

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

我们的博客初级版本主要包含博客文章,文章会有分类以及标签。一篇文章只能有一个分类,但可以打上很多标签。

数据库存储的数据其实就是表格的形式,例如存储博客文章的数据库表长这个样子:

文章 id   标题  正文  发表时间    分类  标签
1   title 1 text 1  2016-12-23  Django  Django 学习
2   title 2 text 2  2016-12-24  Django  Django 学习
3   title 3 text 3  2016-12-26  Python  Python 学习

其中文章 ID 是一个数字,唯一对应着一篇文章。当然还可以有更多的列以存储更多相关数据,这只是一个最基本的示例。 数据库表设计成这样其实已经可以了,但是稍微分析一下我们就会发现一个问题,这 3 篇文章的分类和标签都是相同的,这会产生很多重复数据,当数据量很大时就浪费了存储空间。 不同的文章可能它们对应的分类或者标签是相同的,所以我们把分类和标签提取出来,做成单独的数据库表,再把文章和分类、标签关联起来。下面分别是分类和标签的数据库表:

分类 id   分类名
1   Django
2   Python
标签 id   标签名
1   Django 学习
2   Python 学习

编写博客模型代码

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

blog/models.py

from django.db import models

class Category(models.Model):
    name = models.CharField(max_length=100,verbose_name="分类名称")

上面弄代码的解释为: Category 就是一个标准的 Python 类,它继承了 models.Model 类,类名为 Category 。Category 类有一个属性 name,它是 models.CharField 的一个实例。 这样,Django 就可以把这个类翻译成数据库的操作语言,在数据库里创建一个名为 category 的表格,这个表格的一个列名为 name。还有一个列 id,Django 则会自动创建。可以看出从 Python 代码翻译成数据库语言时其规则就是一个 Python 类对应一个数据库表格,类名即表名,类的属性对应着表格的列,属性名即列名。 我们需要 3 个表格:文章(Post)、分类(Category)以及标签(Tag),下面就来分别编写它们对应的 Python 类。模型的代码通常写在相关应用的 models.py 文件里。已经在代码中做了详细的注释,说明每一句代码的含义。但如果你在移动端下阅读不便的话,也可以跳到代码后面看正文的里的讲解。 注意:在django2.0中,只能使用python3

from django.db import models

# Create your models here.

class  Post(models.Model):
    title=models.CharField(max_length=50,verbose_name="文章标题")
    time=models.DateTimeField(auto_now_add=True,verbose_name="文章发表时间")
    modifyTime=models.DateTimeField(auto_now=True,verbose_name="修改时间")
    content=models.TextField(verbose_name="内容")
    read_num=models.IntegerField(default=0,verbose_name="阅读次数")

    class  Meta:
        verbose_name="文章信息"
        verbose_name_plural=verbose_name

    def __str__(self):
        return  self.title

全文结束,欢迎在评论区讨论~

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

扫码关注云+社区

领取腾讯云代金券