Django搭建博客记录 - Part 2
日期: 2024-03-08 | 作者: admin | 浏览: 210

能正常启动Django应用和访问首页后,我们要开始着手博客的后续搭建。

1. 博客数据模型

一般博客会包含文章分类、文章标签、文章详情、友情链接等,每个文章也会有对应的分类,还会有相应的标签,然后文章详情还会包含标题、作者、发布时间、浏览量等等信息。

Django的Model就是处理这些的,用更加专业一点的说法,就是 Django 为我们提供了一套 ORM(Object Relational Mapping)系统。我们只需要在Model里用Python语言定义各数据结构,Django会自动处理转换为相应的表机构。

# blog/model.py
from django.db import models


# 文章分类
class Category(models.Model):
    # 文章分类的一个属性,即后续数据库中会有一列name,代表分类名称
    name = models.CharField('文章分类', max_length=50)

    # 嵌套类主要是细化功能,例如verbose_name定义显示名称,verbose_name_plural是复数形式,若不指定的话,会自动加s,db_table指定数据库表的名称
    class Meta:
        verbose_name = '文章分类'
        verbose_name_plural = verbose_name
        db_table = 'blog_category'
    
    # 定义字符串表现形式,打印或返回时,可以更直观
    def __str__(self):
        return self.name

Django有各种数据类型,例如文本(CharField)、数值(IntegerField)、布尔(BooleanField)等等各种类型,具体可以参考官方文档:https://docs.djangoproject.com/zh-hans/5.0/ref/models/fields/

2. 完整数据模型
# blog/models.py
from django.db import models
from django.utils import timezone
# Create your models here.


# 文章分类
class Category(models.Model):
    name = models.CharField('文章分类', max_length=50)

    class Meta:
        verbose_name = '文章分类'
        verbose_name_plural = verbose_name
        db_table = 'blog_category'

    def __str__(self):
        return self.name


# 文章标签
class Tag(models.Model):
    name = models.CharField('文章标签', max_length=50, unique=True)

    class Meta:
        verbose_name = '文章标签'
        verbose_name_plural = verbose_name
        db_table = 'blog_tag'

    def __str__(self):
        return self.name


# 文章详情
class Article(models.Model):
    title = models.CharField('标题', max_length=100)
    # 一对一,即每篇文章只有一个对应分类
    category = models.ForeignKey('Category', verbose_name='类别', on_delete=models.CASCADE)
    # 一对多,即每篇文章可以有多个标签
    # blank=True 表示文章可以没有标签
    tag = models.ManyToManyField('Tag', verbose_name='标签', blank=True)
    content = models.TextField(verbose_name='详情')
    # 默认为当前时间
    publish_time = models.DateField('发布时间', default=timezone.now)
    # default 可以设置默认值
    author = models.CharField('作者', max_length=50, default='admin')
    hits = models.PositiveIntegerField('浏览量', default=0)
    # Python中的布尔判断: True == 1, False == 0
    state = models.BooleanField('状态', default=1)

    class Meta:
        verbose_name = '文章列表'
        verbose_name_plural = verbose_name
        db_table = 'blog_article'
        ordering = ('-publish_time',)

    def __str__(self):
        return self.title

    # 浏览量自增
    def raise_hits(self):
        self.hits += 1
        # 更新浏览量
        self.save(update_fields=['hits'])


# 友情链接
class Link(models.Model):
    name = models.CharField('友链名称', max_length=50)
    # URLField,自带URL检测功能,max_length默认为200
    url = models.URLField('地址')

    class Meta:
        verbose_name = '友链列表'
        verbose_name_plural = verbose_name
        db_table = 'blog_link'

    def __str__(self):
        return self.name
3. 真正的ORM

模型定义好后,需要使用manage命令,执行数据模型迁移到数据库表,即实现真正的ORM

# 生成数据库迁移文件,但还未迁移到数据库表
python manage.py makemigrations

# 执行迁移操作,执行完后,可以查看数据库表,就有相应的表及字段内容
python manage.py migrate
4. 数据库选择

Django支持 PostgreSQL、MariaDB、MySQL、Oracle 和 SQLite 等,默认的是 SQLite3,一般的个人博客使用其实也够够的了。如需其他数据库,需在 setting.py 中配置相应数据库引擎及数据库信息等。

# Database
# https://docs.djangoproject.com/en/5.0/ref/settings/#databases

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.sqlite3',
        'NAME': BASE_DIR / 'db.sqlite3',
    }
}