個人博客開發-01(基於Python-3.8 + Django-2.2):業務邏輯分析

寫在前面:無論遇到什麼困難,都要微笑面對呀!!!加油加油
以此來記錄個人博客開發歷程

1.前端頁面選擇

爲自己的博客選擇好看的前端頁面,因爲我是自學Python + Django後端開發,不瞭解前端內容,所以直接在模板網站下載好看的界面來修改即可。我選擇的前端模板來自楊青青個人博客,選擇完成下載即可。(也可以從17素材網等地方下載,有的是需要VIP和金幣的,就只能八仙過海,各顯神通了;我這邊有十個前端模板,若同學需要可以私信或者留言)

2.博客功能構思

在寫代碼之前,需要對要實現的博客功能和界面做一個簡要規劃,磨刀不誤砍柴工嘛。

實現的功能

  • 查看下載的前端頁面,有主頁、關於我、留言頁、博客詳細頁、博客分類頁
  • 博客展示 首頁:展示博客標題、摘要、作者等簡要信息,點擊可以進入博客詳細頁;博客詳細頁:展示完整的博客內容;可以根據博客分類、博客標籤進入該類的博客展示頁。
  • (不會很全,只是大概羅列了一個方向,大概根據前端頁面來開發,前端頁面有什麼接口就開發什麼內容)

業務邏輯分析

  • 博客表:標題、作者、摘要、發佈日期、分類、標籤、閱讀量、評論(在之後的開發中沒有設計評論,問就是前端頁面沒有添加評論的地方,俺自己寫的太醜,遂暫時放棄)、內容
  • 留言表:暱稱、郵箱、內容、創建時間
  • 博客分類表:分類名
  • 博客標籤表:標籤名
  • 備註:在進行業務邏輯分析的過程中,有許多不完善的地方,需要結合開源項目來完善
    接下來,準備開發model層

3. Model層開發

本項目使用PyCharm-2019.3開發

  • 新建Django項目
  • 在終端使用命令創建博客(blog)子應用

django-admin startapp blog

  • settings.py中添加apps,修改數據庫、語言類型和時區
  • 使用PyCharm連接數據庫,在General 中輸入登錄用戶名和密碼,在Advanced中修改serverTimezone 爲 Asia/Shanghai(這是因爲在創建數據庫或表的時候,MySQL可能會報時區錯誤異常,在這裏設置以解決該問題)
    在這裏插入圖片描述
  • 在settings.py中數據庫配置中 ’NAME‘ 對應的數據庫名爲blog(個人創建,可根據需要自行設置),在MySQL中創建數據庫(MySQL大小寫不敏感,所以數據庫名可以直接用 blog 就好,這樣在後面看起來舒服一點,圖就不改了…汗)
    在這裏插入圖片描述
  • 博客表結構的創建
  • 博客表
列名 字段名 字段類型
主鍵 id AutoField
博客標題 blogTitle CharField
博客作者 blogAuthor ForeignKey
博客摘要 abstract CharField
發佈日期 createDatetime DateTimeField
種類 category ForeignKey
標籤 tags ManyToManyField
博客正文 text TextField
瀏覽量 viewsCount PositiveIntegerField
評論數 commentsCount PositiveIntegerField

外鍵約束說明:博客表中的作者、種類、標籤分別與用戶表、種類表、標籤表相關聯。一個作者對應多個博客、一個博客只有一個作者(一對多,ForeignKey);一個博客只有一個種類,一個分類下有多篇博客(一對多,ForeignKey);一篇博客有多個標籤,一個標籤下有多篇博客(多對多,ManyToManyField)。刪除博客,種類、作者不會受影響,刪除作者或種類,該分類下的所有博客被刪除,級聯操作(在一對多的關係中),所以在外鍵約束中加入 on_delete = models.CASADE;

  • 博客種類表
列名 字段名 字段類型
主鍵 id AutoField
博客種類 name CharField
  • 博客標籤表
列名 字段名 字段類型
主鍵 id AutoField
標籤名 name CharField
  • 留言表
列名 字段名 字段類型
主鍵 id AutoField
暱稱 nickname CharField
郵箱 email EmailField
內容 text TextField
創建時間 created_time DateTimeField

補充:還需要增加一些關鍵字來約束這些字段,如:blank = True / False : 在Django後臺管理中新增一條內容時該字段是否可以爲空;default = 設置默認值 ; unique = True / False 能否重複;primary_key = 是否是主鍵等。常用字段約束在本篇博客末尾附表…

對博客表結構在前期按照以上表結構創建,在blog/model.py中寫入模型類代碼

from django.db import models
from django.utils import timezone
from django.utils.html import strip_tags
import os, markdown


def save_img(instance, filename):
    return os.path.join(filename)

# 博客種類
class Category(models.Model):
    id = models.AutoField(verbose_name='主鍵', primary_key=True)
    name = models.CharField(verbose_name='種類名', max_length=100, unique=True)

    # 在後臺管理界面,顯示時會顯示此處定義的 verbose_name
    class Meta():
        verbose_name = verbose_name_plural = '種類表'

    # 在後臺管理界面,添加信息需要引用到博客種類時,顯示的是此函數返回的類屬性
    def __str__(self):
        return self.name


# 標籤,類與方法定義同博客種類
class Tag(models.Model):
    id = models.AutoField(verbose_name='主鍵', primary_key=True)
    name = models.CharField(verbose_name='標籤名', max_length=100, unique=True)

    class Meta():
        verbose_name = verbose_name_plural = '標籤表'

    def __str__(self):
        return self.name


# 博客
class Blog(models.Model):
    id = models.AutoField(verbose_name='主鍵', primary_key=True)
    blogTitle = models.CharField(verbose_name='文章標題', max_length=70, unique=True)
    abstract = models.CharField(verbose_name='摘要', max_length=200, blank=True)
    createDatetime = models.DateTimeField(verbose_name='創建時間', blank=True, default=timezone.now)
    viewsCount = models.PositiveIntegerField(verbose_name='瀏覽量', default=0, editable=False)
    commentsCount = models.PositiveIntegerField(verbose_name='評論數', blank=True, default=0)
    # 上傳圖片,重寫 upload_to 方法,其存儲路徑是相對於MEIDA_ROOT而來的,見參考博客 1
    imgName = models.ImageField(upload_to=save_img, verbose_name='博客圖片', null=True, blank=True)
    text = models.TextField(verbose_name='博客正文')
    category = models.ForeignKey(to=Category, on_delete=models.CASCADE, verbose_name='分類', related_name='category_set')
    tags = models.ManyToManyField(to=Tag, verbose_name='標籤', related_name='tags_set')

    def save(self, *args, **kwargs):
        # 首先實例化一個 Markdown 類,用於渲染 body 的文本。
        # 由於摘要並不需要生成文章目錄,所以去掉了目錄拓展。
        md = markdown.Markdown(extensions=[
            'markdown.extensions.extra',
            'markdown.extensions.codehilite',
        ])
        # 先將 Markdown 文本渲染成 HTML 文本
        # strip_tags 去掉 HTML 文本的全部 HTML 標籤
        # 從文本摘取前 54 個字符賦給 excerpt
        self.abstract = strip_tags(md.convert(self.text))[:100] + '...'
        super().save(*args, **kwargs)

    class Meta():
        verbose_name = verbose_name_plural = '博客表'

    def __str__(self):
        return self.blogTitle

    # 當調用該方法,瀏覽量增加。
    # 調用 self.save() 保存這個修改過的類的實例,
    # update_fields 用來指定哪些字段需要更新,別的不更新。默認是None,這樣所有字段都會更新一遍。
    # 時候字段很多而我們只需要更新很少的字段,可以用這個參數來提高一下效率。
    # 更多詳細內容見參考博客 2
    def increase_views(self):
        self.viewsCount += 1
        self.save(update_fields=['viewsCount'])


# 留言表
class Comment(models.Model):
    id = models.AutoField(verbose_name='主鍵', primary_key=True)
    nickname = models.CharField(verbose_name='暱稱', max_length=100, default='小豬豬')
    email = models.EmailField(verbose_name='郵箱')
    text = models.TextField(verbose_name='內容')
    created_time = models.DateTimeField(verbose_name='創建時間', default=timezone.now)

    class Meta:
        verbose_name = '留言表'
        verbose_name_plural = verbose_name
  • 執行命令

python manage.py makemigrations
python manage.py migrate

  • 生成遷移文件,執行遷移文件,在數據庫中創建表,增加字段等操作,替代了我們在數據庫中使用SQL語言進行復雜的操作
    有關這兩個命令的區別,請移步【Django2.0】python manage.py makemigrations 和 python manage.py migrate的區別,有關模型類創建,增刪改查等操作,ORM原理等相關知識,需要自行百度。
  • 創建完成之後可以在PyCharm 中鏈接 MySQL 查看錶結構是否成功。

補充:
常用字段約束

字段約束 含義 默認值
primary_key 是否是主鍵 False(不是主鍵)
null 能否爲空 False(不能爲空)
unique 能否重複 False(可以重複)
default 默認值 False
blank 在Django後臺中能否爲空 False(不能爲空)

參考博客:

  1. Django自定義圖片和文件上傳路徑(upload_to)的2種方式
  2. django model中的save()方法
  3. IDEA中配置MySQL出現Server returns invalid timezone問題解決方法
  4. 關於models中的字段屬性,參考:Django之Models進階操作(字段屬性)
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章