Let's Django!Let's Django!

這是 Django Tutorial 的第 7 篇,範例程式碼可參考我的 GitHub 專案

本文相關的程式碼改動,都集中在這個 PR


本文可視為 Django ORM 外鍵教學第三部分——查詢篇——的前置教學,因為我們需要一些範例資料作為查詢的標的。

為了快速且輕鬆地建立這些範例,我們要善用 Django fixture。

本文介紹 Django fixture 的基本用法,並以 Django-Tutorial 的範例資料為例,示範如何導出與匯入 fixture。

什麼是 Django Fixture

Django fixture 是一種用來管理資料庫數據的工具。

它允許你以 JSON 或 XML 等格式將資料庫中的數據導出(序列化)到特定文件中,並在需要時將這些數據匯入到資料庫。

你可以輕鬆地透過 Django fixture 初始化資料庫內容,設置測試數據,或者在不同環境間傳輸數據。

顯然的,它也很適合用來「快速建立」(或說匯入)我文章教學所需要的資料。

更多細節與介紹,可參考 Django 文件


Django Fixture 的三大用途

Django fixture 主要有三種用途。我覺得第一種情況是最有實務價值的。

一、初始化資料庫

  • 在開發或首次部署,用於建立資料庫中的初始數據。
  • 常用於設定預設的用戶、權限或其他需要的基礎選項數據。

資料庫中總有一些,在專案部署階段就必須存在的資料

比如「服務類型」為了未來的擴充彈性,選擇不寫成簡單的 enum(Django choices)欄位,而是直接獨立一個 db table,table 中的每一筆資料都是現有的服務類型。

而我們需要在首次部署時,把當前所有服務類型預先寫入 db,即資料初始化

這個需求很常見,也很適合用 Django fixture 來處理。

二、測

  • 測試時用來準備一致的測試數據,確保測試的可靠性和可重現性。
  • 測試資料可以被重複使用,不需要每次手動建立。

如果有用 pytest,基本上會被 pytest fixture 取代,我幾乎沒這麼用過。

三、資料的備份與還原

  • 可以用來導出資料庫的部分或全部數據,方便做數據備份。
  • 在需要時可以通過 fixture 還原資料庫的狀態。

備份大量資料顯然有更好、更標準的方式,所以這比較適合備份簡單的資料。

比如我們後續教學用的範例資料,恰好適合!


進入正題。

我們要為 Django Tutorial 的 models 建立一些簡單的範例資料。

建立範例資料並導出為 Fixture

這是建立資料的 Python script:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
from post.models import Post, Subtitle, Comment

# 建立 Post
post1 = Post.objects.create(title="Django Fixtures", content="Content of Django Fixtures")
post2 = Post.objects.create(title="ORM Basics", content="Content of ORM Basics")
post3 = Post.objects.create(title="Advanced Queries", content="Content of Advanced Queries")

# 建立 Subtitle
subtitle1 = Subtitle.objects.create(content="An Overview", post=post1)
subtitle2 = Subtitle.objects.create(content="Introduction to ORM", post=post2)

# 建立 Comment
Comment.objects.create(content="Great article!", post=post1)
Comment.objects.create(content="Very informative.", post=post2)
Comment.objects.create(content="Helped a lot!", post=post3)
Comment.objects.create(content="Need more examples.", post=post3)
Comment.objects.create(content="Thanks for the tips!", post=post3)

要使用這段程式碼來建立 db 實例,需要進入 Django shell 並執行程式碼。

我本來想用這種方式,讓讀者也可以自行建立資料並重現教學環境,但這樣的方式顯然不夠友好。

更好的方式是使用 Django fixture。

導出為 Fixture

一旦導出為 Django fixture,讀者只需要透過 Django 指令匯入,就可以重現整個 db 的資料環境,無疑是更好的選擇!

如何導出,使用dumpdata指令:

1
python manage.py dumpdata post --output=post_data.json

可以用post(Django app 名稱)來限定要輸出的 model 資料範圍。

如果不指定 app,dumpdata 指令會嘗試匯出整個專案的所有資料,包括 Django 本身的內建 db 資料。這通常包括大量不必要的內容,並且讓輸出文件變得過於複雜。

匯入 Fixture

輸出之後就是匯入,匯入也非常簡單,使用loaddata指令:

1
python manage.py loaddata post_data.json

實際執行結果:

1
2
❯ python manage.py loaddata post_data.json
Installed 10 object(s) from 1 fixture(s)

會顯示總共匯入了幾筆資料,以及來源總共是幾筆 Django fixture(s)。

附帶一提,匯入之前,記得先確保已完成所有的 db 遷移!

1
python manage.py migrate