Django开发个人博客项目-(3)博客数据库设计
欢迎访问我的博客:小羊驼的部落阁
Django是通过Model操作数据库,不管你数据库的类型是MySql或者Sqlite,Django它自动帮你生成相应数据库类型的SQL语句,所以不需要关注SQL语句和类型,对数据的操作Django帮我们自动完成。只要回写Model就可以了!
首先是博客文章这个表,肯定要包括以下几点:博客的标题、博客的内容、博客的发表时间、博客的修改时间、博客的分类、博客的点击量。当然,一般情况下还要有博客的作者,因为我们整个网站发布文章的都是只有我们自己一个人,也就是不包含其它用户,因此作者这里就可以不写了。针对博客的分类,我们我们有很多网站可以参考,这里就不赘述了,一篇博客只能有一个分类,但是可以有多个标签,比如我现在写的这篇博客,可以分类到django 下,但是它可以有多个标签:django、博客、数据库、开发……
考虑到每一篇博客都只能有一个分类,而一个分类下是可以包含很多博客的,因此分类与博客是一对多的关系,此时应当使用外键来进行关联。而一篇博客可以有多个标签, 每个标签也可以包含多个博客,因此,标签与博客是多对多的关系。关于一对多与多对多的知识话题,这里就不再展开了,不熟悉的同学可以查看django文档与相关资料。
因此,通过上述分析,我们可以确定出三个数据表,博客(Blog)、分类(Category)与标签(Tag)。下面在myblog目录下的models.py中创建这三个表,由于Blog表包含外键与多对多关系,因此首先应当建立另外两个表:
标签(Tag)表:
class Tag(models.Model):
"""
文章标签
"""
name = models.CharField(verbose_name='文章标签', max_length=20)
number = models.IntegerField(verbose_name='标签数目', default=1)
class Meta:
verbose_name = '文章标签'
verbose_name_plural = verbose_name
def __str__(self):
return self.name
分类(category)表:
我们这里采用的是多级分类,即Python分类下有django和Flask分类。在这里我们需要使用MPTT
,我们先在虚拟环境中安装mptt
:
pip install django-mptt
然后将mptt注册到app中:
INSTALLED_APPS = [
...
'myblog',
'mptt',
]
回到models.py中,导入from mptt.models import MPTTModel
class Category(MPTTModel):
name = models.CharField('文章分类', max_length=50, unique=True)
parent_name = models.ForeignKey('self', verbose_name='上级分类', null=True, blank=True, related_name='children', on_delete=models.CASCADE)
number = models.IntegerField(verbose_name='分类数目', default=1)
class Meta:
db_table = 'category'
verbose_name = verbose_name_plural = '文章分类'
class MPTTMeta:
parent_attr = 'parent_name'
def __str__(self):
return self.name
博客(blog)表:
在有的博客中, 我们可能需要用到文章封面,但是文章封面需要有个上传的地方,此时我们就需要在项目根目录下创建一个uploads
文件夹,然后在settings.py底部写入以下:
STATIC_URL = '/static/'
STATICFILES_DIRS = (
os.path.join(BASE_DIR, 'static'),
)
MEDIA_ROOT = os.path.join(BASE_DIR, 'uploads') #uploads必须存在,且在项目目录下
MEDIA_URL = '/uploads/' #你上传的文件和图片会默认存在/uploads/editor下
然后在blog文件夹中的url.py中加上:
from django.contrib import admin
from django.urls import path
from django.conf import settings
from django.conf.urls.static import static
urlpatterns = [
path('admin/', admin.site.urls),
]
if settings.DEBUG:
# static files (images, css, javascript, etc.)
urlpatterns += static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)
创建blog表:
class Blog(models.Model):
"""
博客
"""
title = models.CharField(verbose_name='标题', max_length=100)
abstract = models.TextField(verbose_name='摘要', max_length=200, default='', blank=True)
img = models.ImageField(upload_to='article_img/%Y/%m/%d/', verbose_name='文章图片', blank=True, null=True)
content = models.TextField()
create_time = models.DateTimeField(verbose_name='创建时间', default=timezone.now)
modify_time = models.DateTimeField(verbose_name='修改时间', auto_now=True)
click_nums = models.IntegerField(verbose_name='点击量', default=0)
category = models.ForeignKey(Category, verbose_name='文章分类', on_delete=models.CASCADE)
tag = models.ManyToManyField(Tag, verbose_name='文章标签')
class Meta:
verbose_name = '我的博客'
verbose_name_plural = verbose_name
def __str__(self):
return self.title
最后:
在Run manage.py Task中执行
makemigrations # 生成迁移文件
migrate # 迁移数据表
即可将这三个表添加到我们的数据库中。
注意:
我们使用的是mysql5.7,但是我们目前并不适用mysql,而是使用Django自带的sqllite数据库,关于配置mysql数据库,我们后面再说。