欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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

程序员文章站 2022-05-24 21:03:35
...

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