Django學習 (二) Django博客項目數據庫模型

參考原文鏈接 https://www.zmrenwu.com/courses/django-blog-tutorial/materials/4/

設計博客的數據庫表結構

博客的文章應該含有標題、正文、作者、發表時間等數據。一個更加現代化的博客文章還希望它有分類、標籤、評論等。爲了更好地存儲這些數據,我們需要合理地組織數據庫的表結構。

文章 id 標題 正文 發表時間 分類 標籤
1 title 1 text 1 2019-01-01 Django Django 學習
2 title 2 text 2 2019-01-02 Django Django 學習
3 title 3 text 3 2019-01-03 Python Python 學習

其中文章 ID 是一個數字,唯一對應着一篇文章。當然還可以有更多的列以存儲更多相關數據,這只是一個最基本的示例。

數據庫表設計成這樣其實已經可以了,但是稍微分析一下我們就會發現一個問題,這 3 篇文章的分類和標籤都是相同的,這會產生很多重複數據,當數據量很大時就浪費了存儲空間。

不同的文章可能它們對應的分類或者標籤是相同的,所以我們把分類和標籤提取出來,做成單獨的數據庫表,再把文章和分類、標籤關聯起來。下面分別是分類和標籤的數據庫表:

分類 id 分類名
1 Django
2 Python
標籤 id 標籤名
1 Django 學習
2 Python 學習

編寫博客模型代碼 

我們的分類數據庫表,Django 只要求我們這樣寫:

blog/models.py

from django.db import models

class Category(models.Model):
    name = models.CharField(max_length=100)

Category 就是一個標準的 Python 類,它繼承了 models.Model 類,類名爲 CategoryCategory 類有一個屬性 name,它是 models.CharField 的一個實例。

這樣,Django 就可以把這個類翻譯成數據庫的操作語言,在數據庫裏創建一個名爲 category 的表格,這個表格的一個列名爲 name。還有一個列 id,Django 則會自動創建。可以看出從 Python 代碼翻譯成數據庫語言時其規則就是一個 Python 類對應一個數據庫表格,類名即表名,類的屬性對應着表格的列,屬性名即列名。

 


遷移數據庫

使用工程管理助手 manage.py來讓 Django 完成翻譯,創建好這些數據庫表,分別運行 python manage.py makemigrationspython manage.py migrate 命令:

當我們執行了 python manage.py makemigrations 後,Django 在 blog 應用的 migrations\ 目錄下生成了一個 0001_initial.py 文件,這個文件是 Django 用來記錄我們對模型做了哪些修改的文件。目前來說,我們在 models.py 文件裏創建了 3 個模型類,Django 把這些變化記錄在了 0001_initial.py 裏。

這裏有個小坑 Model中需要加上 on_delete=models.CASCADE,否則報錯

只是告訴了 Django 我們做了哪些改變,爲了讓 Django 真正地爲我們創建數據庫表,接下來又執行了 python manage.py migrate 命令。Django 通過檢測應用中 migrations\ 目錄下的文件,得知我們對數據庫做了哪些操作,然後它把這些操作翻譯成數據庫操作語言,從而把這些操作作用於真正的數據庫。

對於瞭解數據庫語言的人,你可以運行下面的命令看看 Django 究竟爲我們做了什麼:

python manage.py sqlmigrate blog 0001


選擇數據庫版本

在這裏Django 就幫我們遷移了數據庫,這是因爲我們使用了 Python 內置的 SQLite3 數據庫。

SQLite3 是一個十分輕巧的數據庫,它僅有一個文件。你可以看一到項目根目錄下多出了一個 db.sqlite3 的文件,這就是 SQLite3 數據庫文件,Django 博客的數據都會保存在這個數據庫文件裏。我們也可以使用MySQL等常用數據庫

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.sqlite3',
        'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
    }
}

用 Django 的方式操作數據庫

存數據

1. manage.py shell 命令

我們首先導入 3 個之前寫好的模型類,然後實例化了一個 Category 類和一個 Tag 類,爲他們的屬性 name 賦了值。爲了讓 Django 把這些數據保存進數據庫,調用實例的 save 方法即可。

python manage.py shell
>>> from blog.models import Category, Tag, Post
>>> c = Category(name='category test')
>>> c.save()
>>> t = Tag(name='tag test')
>>> t.save()

2. python manage.py createXXX

python manage.py createsuperuser

 

取數據

>>> Category.objects.all()
<QuerySet [<Category: Category object>]>
>>> Tag.objects.all()
<QuerySet [<Tag: Tag object>]>
>>> Post.objects.all()
<QuerySet [<Post: Post object>]>
>>>

改數據

>>> c = Category.objects.get(name='category test')
>>> c.name = 'category test new'
>>> c.save()
>>> Category.objects.all()
<QuerySet [<Category: test category new>]>

刪數據

>>> p = Post.objects.get(title='title test')
>>> p
<Post: title test>
>>> p.delete()
(1, {'blog.Post_tags': 0, 'blog.Post': 1})
>>> Post.objects.all()
<QuerySet []>

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章