Django个人博客开发(五)数据库与Model 设计
发布时间:2018-04-14 10:04:08分类:编程开发阅读:1241
概述
分析设计项目数据库表及其字段,然后通过workbench创建对应的数据库模型。通过编写相应的Model类,将数据库迁移到Mysql服务器上。
1、分析项目数据库表及其字段
|
Django个人博客数据库表 |
|||
|
tag|标签表 |
|||
|
字段 |
类型 |
描述 |
备注 |
|
id |
|
|
主键 |
|
name |
CharField(max_length=30) |
标签名称 |
|
|
is_disply |
BooleanField(default=True) |
是否显示 |
|
|
|
|
|
|
|
category|分类表 |
|||
|
字段 |
类型 |
描述 |
备注 |
|
id |
|
|
主键 |
|
name |
CharField(max_length=30) |
分类名称 |
|
|
index |
IntegerField(default=999) |
分类排序 |
|
|
|
|
|
|
|
article|文章表 |
|||
|
字段 |
类型 |
描述 |
备注 |
|
id |
|
|
主键 |
|
title |
CharField(max_length=60) |
文章标题 |
|
|
slug |
CharField(max_length=100) |
文章标题链接名 |
|
|
abstract |
TextField(max_length=200) |
文章摘要 |
|
|
content |
TextField() |
文章内容 |
|
|
picture |
ImageField(upload_to=,blank=True) |
图片 |
|
|
hits |
IntegerField(default=0) |
点击次数 |
|
|
is_recommend |
BooleanField(default=0) |
是否推荐 |
|
|
publish |
DateTimeField(auto_now_add=True) |
发布时间 |
|
|
category |
ForeignKey(Category, related_name='article') |
分类 |
外键category表 |
|
tags |
ManyToManyField(Tag, related_name='arfticle') |
标签 |
多对多tag表 |
|
|
|
|
|
|
comment|评论表 |
|||
|
字段 |
类型 |
描述 |
备注 |
|
id |
|
|
主键 |
|
content |
TextField() |
评论内容 |
|
|
username |
CharField(max_length=45, blank=True) |
用户名 |
|
|
|
EmailField(blank=True) |
邮箱地址 |
|
|
url |
URLField(blank=True) |
个人网页地址 |
|
|
publish |
DateTimeField(auto_now_add=True) |
发布时间 |
|
|
article |
ForeignKey(Article, related_name='comment') |
文章 |
外键article表 |
|
pid |
IntegerField() |
父级评论 |
|
|
|
|
|
|
|
links|友情链接表 |
|||
|
字段 |
类型 |
描述 |
备注 |
|
id |
|
|
主键 |
|
title |
CharField(max_length=45) |
标题 |
|
|
description |
CharField(max_length=100) |
表情链接描述 |
|
|
url |
URLField() |
url地址 |
|
|
publish |
DateTimeField(auto_now_add=True) |
发布时间 |
|
|
index |
IntegerField(default=999) |
排列顺序 |
|
2、用workbench创建数据库模型
3、编写Model类,文件blog/models.py
from django.db import models
from slugify import slugify
from django.shortcuts import reverse
# Create your models here.
# 文件上传路径(/MEDIA_ROOT/article_picture/文章id/文件名)
def upload_generation_dir(instance, filename):
name, suffix = filename.rsplit('.', 1) # 拆开文件和扩展名(如:'图片文件.png'则取'图片文件'和'png')
return 'article_picture/{0}-{1}.{2}'.format(instance.id, slugify(name), suffix)
# 文章分类表数据模型
class Category(models.Model):
name = models.CharField(max_length=30, verbose_name='分类名称')
index = models.IntegerField(default=999, verbose_name='分类排序(从大到小)')
class Meta:
ordering = ['index']
verbose_name = '文章分类'
verbose_name_plural = verbose_name
def __str__(self):
return self.name
# 标签表数据模型
class Tag(models.Model):
name = models.CharField(max_length=30, verbose_name='标签名')
is_display = models.BooleanField(default=True, verbose_name='是否显示(默认是)')
class Meta:
verbose_name = '标签'
verbose_name_plural = verbose_name
# 返回当前标签下文章数
def article_count(self):
return self.article.all().count()
def __str__(self):
return self.name
# 文章表数据模型
class Article(models.Model):
title = models.CharField(max_length=60, verbose_name='文章标题')
category = models.ForeignKey(Category, related_name='article', verbose_name='分类')
slug = models.CharField(max_length=200, verbose_name='标题映射链接名')
abstract = models.TextField(max_length=400, verbose_name='文章摘要')
content = models.TextField(verbose_name='文章内容')
picture = models.ImageField(upload_to=upload_generation_dir, blank=True, verbose_name='文章展示图片')
hits = models.IntegerField(default=0, verbose_name='点击次数')
is_recommend = models.BooleanField(default=False, verbose_name='是否推荐(默认否)')
publish = models.DateTimeField(auto_now_add=True, verbose_name='发布时间')
tag = models.ManyToManyField(Tag, related_name='article', verbose_name='标签')
class Meta:
ordering = ['-publish']
verbose_name = '文章'
verbose_name_plural = verbose_name
# 重写save()方法
def save(self, *args, **kwargs):
self.slug = slugify(self.title) # 转标题转换为链接标题格式,如"我的博客"转换为"wo-de-bo-ke"
super(Article, self).save(*args, **kwargs)
# 获取文章详情链接URL
def get_absolute_url(self):
return reverse('blog:article_detail', args=[self.id, self.slug])
def __str__(self):
return "【{0}】 {1}".format(self.category.name, self.title)
# 评论表数据模型
class Comment(models.Model):
content = models.TextField(verbose_name='评论内容')
username = models.CharField(max_length=45, verbose_name='用户名', blank=True)
email = models.EmailField(verbose_name='邮箱', blank=True)
url = models.URLField(verbose_name='网址', blank=True)
publish = models.DateTimeField(auto_now_add=True, verbose_name='评论时间')
article = models.ForeignKey(Article, related_name='comment', verbose_name='文章')
pid = models.IntegerField(verbose_name='父级ID')
class Meta:
ordering = ['-publish']
verbose_name = '留言/评论'
verbose_name_plural = verbose_name
def __str__(self):
return str(self.id)
# 友情链接表数据模型
class Links(models.Model):
title = models.CharField(max_length=45, verbose_name='链接标题')
description = models.CharField(max_length=100, verbose_name='链接描述')
url = models.URLField(verbose_name='链接网址')
publish = models.DateTimeField(auto_now_add=True, verbose_name='发布时间')
index = models.IntegerField(default=999, verbose_name='排序(从大到小)')
class Meta:
ordering = ['-publish']
verbose_name = '友情链接'
verbose_name_plural = verbose_name
def __str__(self):
return self.title
4、创建对应的Mysql库
sh# mysql -uroot -p -e “CREATE database db_xdsite DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci;”
5、在xdsite/settings.py中配置Mysql
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql',
'NAME': 'db_xdsite',
'HOST': '192.168.100.1',
'PORT': '3306',
'USER': 'webapp',
'PASSWORD': 'web123456app',
}
}
6、迁移数据库到Mysql服务器上
(VENV_PY35) E:\Program_Code\PyProject\xdsite>python manage.py makemigrations
(VENV_PY35) E:\Program_Code\PyProject\xdsite>python manage.py migrate
7、检查Mysql数据库服务器上是否有对应的库表
代码查看:https://github.com/xdao07/xdsite/tree/v0.0.2
代码下载:git clone --branch v0.0.2 https://github.com/xdao07/xdsite.git