Django开发个人博客项目-(3)博客数据库设计

0.216字数 816阅读 7

欢迎访问我的博客:小羊驼的部落阁
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数据库,我们后面再说。

推荐阅读更多精彩内容