设计博客的数据库表结构
把写好的文章永久地保存在数据库里,当用户访问我们的博客时,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 把数据库的语法转换成了 Python 的语法形式,只要写Python 代码,Django 会把 Python 代码翻译成对应的数据库操作语言。专业的说,Django 为我们提供了一套 ORM(Object Relational Mapping)系统。
编写 3 个表格:文章(Post)、分类(Category)以及标签(Tag)对应的 Python 类。
模型的代码通常写在相关应用的 models.py 文件里。
Django 内置全部类型文档:https://docs.djangoproject.com/en/1.10/ref/models/fields/#field-types
数据库关系文档:https://docs.djangoproject.com/en/1.10/topics/db/models/#relationships
from django.db import models
from django.contrib.auth.model import User
# Create your models here.
class Category(models.Model):
"""
Django 要求模型必须继承 models.Model 类
Category 只需一个简单分类名 name 即可
CharField 指定分类名 name 的数据类型,CharField是字符型
max_length 参数指定最大长度
"""
name = models.CharField(max_length=100)
class Tag(models.Model):
name = models.CharField(max_length=100)
class Post(models.Model):
# 文章标题
title = models.CharField(max_length=70)
# 文章正文
# Textfield 字符型存储大段文本
body = models.TextField()
# 文章创建时间和最后一次更改时间
# DateTimeField 存储时间数据类型
created_time = models.DateTimeField()
modified_time = models.DateTimeField()
# 文章摘要
# CharField 为空报错(blank = True允许空值
excerpt = models.CharField(max_length=200, blank=True)
# 分类与标签
# 一篇文章对应一个分类,一个分类对应多篇文章
# 使用ForeignKey 一对多关系
# 一篇文章对应多个标签,一个标签对应多篇文章
# ManyToManyField 多对多关系
category = models.ForeignKey(Category)
tags = models.ManyToMany(Tag, blank=True)
# 作者
# User 是从 django.contrib.auth.model 导入的
# django.contrib.auth:Django内置应用,处理网站用户注册、登陆等流程
# User 是 Django 写好的用户模型
author = models.ForeignKey(User)