Logo

新人日誌

首頁關於我部落格

新人日誌

Logo

網站會不定期發佈技術筆記、職場心得相關的內容,歡迎關注本站!

網站
首頁關於我部落格
部落格
分類系列文

© 新人日誌. All rights reserved. 2020-present.

新手指南:透過自訂管理指令初始化分類資料

最後更新:2024年12月24日Python

本文為 Django 分類功能系列教學,第 4 篇:

  1. 新手指南:如何設計 Django 分類功能
  2. 新手指南:如何定義需求並實現分類模型
  3. 新手指南:Service 模型與 related_name 的作用
  4. 新手指南:透過自訂管理指令初始化分類資料 👈 所在位置
  5. 自訂管理指令:程式碼詳細解說
  6. 新手指南:深入理解 get_or_create 的作用與用法
  7. Django 新手指南:新增分類欄位的邏輯
  8. Django 新手指南:如何正確編輯服務分類
  9. Django 新手指南:modelform 數據提交原理解析
  10. Django 分類頁畫面顯示功能指南
  11. Django 外鍵查詢入門:category_id 與 category.id 的區別

在開發 Django 專案時,經常需要初始化一些基礎資料,例如為分類模型添加預設分類。

使用自訂管理指令(Management Command)是一種高效且靈活的方法,特別適合需要經常初始化或批量處理數據的場景。

本文將逐步介紹如何透過自訂管理指令來實現分類資料的初始化。


目錄結構規劃

必須遵循的目錄結構

在 Django 中,自訂管理指令的文件需放置於固定的目錄結構下,否則系統將無法識別指令:

your_app/
└── management/
    └── commands/
        └── seed_categories.py

重點說明:

  • management/ 和 commands/ 必須是資料夾。
  • 目錄中需包含 __init__.py,即使是空文件,也需存在,以標識這些資料夾為 Python 模組。

如何創建目錄與文件

您可以使用以下命令快速創建目錄與必要的文件:

mkdir -p your_app/management/commands
touch your_app/management/__init__.py
touch your_app/management/commands/__init__.py
touch your_app/management/commands/seed_categories.py

撰寫自訂指令的代碼

seed_categories.py 文件內容

在 seed_categories.py 中,撰寫自訂管理指令邏輯,以下是一個初始化分類資料的範例:

from django.core.management.base import BaseCommand
from categories.models import Category

class Command(BaseCommand):
    help = "Seeds the database with categories"

    def handle(self, *args, **options):

        initial_categories = [
            {"name": "設計與創意", "created_at": "2024-12-23"},
            {"name": "技術程式開發", "created_at": "2024-12-23"},
            {"name": "寫作與內容創作", "created_at": "2024-12-23"},
            {"name": "行銷與廣告", "created_at": "2024-12-23"},
            {"name": "攝影創作", "created_at": "2024-12-23"},
            {"name": "顧問與專業服務", "created_at": "2024-12-23"},
            {"name": "生活娛樂", "created_at": "2024-12-23"},
        ]

        for category in initial_categories:

            result = Category.objects.get_or_create(
                name=category["name"], created_at=category["created_at"]
            )

            category = result[0]
            created = result[1]

            if created:
                self.stdout.write(self.style.SUCCESS(f"Category '{category.name}' created"))
            else:
                self.stdout.write(self.style.WARNING(f"Category '{category.name}' already exists"))

代碼解析

  • BaseCommand:所有自訂管理指令的基礎類,提供執行指令的框架。
  • help 屬性:為指令添加說明,在執行 python manage.py help 時顯示。
  • handle 方法:指令的核心邏輯,所有操作都從這裡開始。
  • get_or_create:檢查分類是否存在,若不存在則創建新分類。
  • 輸出提示:
    • 成功新增分類時,使用綠色字體(style.SUCCESS)顯示提示。
    • 如果分類已存在,輸出普通文本提示。

執行自訂管理指令

完成代碼後,即可使用以下命令執行初始化操作:

python manage.py seed_categories

執行結果示例

情況 1:分類為首次新增

當所有分類為首次新增時,終端將輸出以下訊息:

Category '設計與創意' created.
Category '技術程式開發' created.
Category '寫作與內容創作' created.
Category '行銷與廣告' created.
Category '攝影創作' created.
Category '顧問與專業服務' created.
Category '生活娛樂' created.
初始化分類資料完成!

情況 2:部分或全部分類已存在

若某些分類已存在於資料庫,則終端會輸出以下訊息,提示哪些分類已經存在:

Category '設計與創意' already exists.
Category '技術程式開發' already exists.
Category '寫作與內容創作' already exists.
Category '行銷與廣告' created.
Category '攝影創作' already exists.
Category '顧問與專業服務' created.
Category '生活娛樂' already exists.
初始化分類資料完成!

提示

  • 輸出訊息會根據新增或已存在的分類情況分別顯示 created 或 already exists,便於了解指令的執行情況。
  • 確保您的模型和指令邏輯運行正常,避免意外資料重複或遺漏的情況發生。

最佳實踐

指令檔案的放置位置

  • 如果指令專門針對分類模型,建議放置於 categories app 中。
  • 若指令需要初始化多個模型的數據(如用戶、訂單等),則可統一放置於核心 app(如 core app)。

遵守目錄命名規範

  • management 和 commands 是 Django 規定的目錄名稱,不能修改。
  • 如命名錯誤,Django 將無法識別指令,並顯示錯誤: Unknown command: 'seed_categories'

加入 __init__.py 文件

  • 雖然在 Python 3.3 後 __init__.py 已非必要,但為了相容 Django 的加載邏輯,建議保留。

常見問題

執行指令時提示 Unknown command

  • 原因:目錄結構未正確遵循 Django 的規範。
  • 解決方法:檢查是否存在以下結構:
your_app/
└── management/
    └── commands/
        └── seed_categories.py

重複執行指令時分類被多次新增

  • 原因:未使用 get_or_create 檢查資料是否已存在。
  • 解決方法:使用 Category.objects.get_or_create 確保分類不會重複新增。

總結

透過自訂管理指令,您可以:

  1. 高效初始化分類等基礎數據,簡化開發與部署流程。
  2. 將指令代碼結構化,便於維護與擴展。
  3. 使用清晰的提示輸出,提升使用體驗。

現在您已了解如何在 Django 中設置並執行自訂管理指令,趕快試試吧!

目前還沒有留言,成為第一個留言的人吧!

發表留言

留言將在審核後顯示。

Python

目錄

  • 目錄結構規劃
  • 必須遵循的目錄結構
  • 如何創建目錄與文件
  • 撰寫自訂指令的代碼
  • seed_categories.py 文件內容
  • 代碼解析
  • 執行自訂管理指令
  • 執行結果示例
  • 提示
  • 最佳實踐
  • 指令檔案的放置位置
  • 遵守目錄命名規範
  • 加入 __init__.py 文件
  • 常見問題
  • 執行指令時提示 Unknown command
  • 重複執行指令時分類被多次新增
  • 總結