Logo

新人日誌

首頁關於我部落格

新人日誌

Logo

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

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

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

Django 抽象模型:理解 class Meta: abstract = True

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

本文為圖片轉 WebP 功能模組化系列文,第 4 篇:

  1. 如何設計 Django 的通用工具,並選擇適合的存放位置
  2. 從零開始:如何實現圖片轉 WebP 並上傳到 S3 的功能
  3. 使用基類模型(class model)優化代碼:從零到掌握 DRY 原則
  4. Django 抽象模型:理解 class Meta: abstract = True 👈 所在位置
  5. 為什麼要分離圖片處理邏輯?Django 最佳實踐指南
  6. Django 信號處理:如何在保存前自動處理圖片
  7. Django 信號處理的最佳實踐:如何選擇合適的位置
  8. 將圖片處理移至信號:模型設計的最佳實踐
  9. 理解 Python 的方法解析順序 (MRO):Django 多重繼承的最佳實踐

建議閱讀本文前,先閱讀完 圖片轉 WebP 系列文

在 Django 開發中,有時我們需要為多個模型提供通用功能,卻不希望這些功能生成多餘的數據庫表。

這時,抽象模型(Abstract Model)成為了解決問題的利器。

本文將帶你了解 class Meta: abstract = True 的作用及其應用,幫助新手掌握這一重要的 Django 特性。


什麼是抽象模型?

在 Django 中,如果一個模型的 Meta 類中定義了 abstract = True,那麼這個模型就是一個抽象模型。

這類模型的特點是:

  • 不會生成數據庫表:Django 不會在數據庫中為抽象模型創建對應的表結構。
  • 作為基類繼承:抽象模型的作用是為其他模型提供基礎功能。

定義示例

from django.db import models

class BaseModel(models.Model):
    created_at = models.DateTimeField(auto_now_add=True)
    updated_at = models.DateTimeField(auto_now=True)

    class Meta:
        abstract = True  # 設置為抽象模型

使用方式

其他模型可以通過繼承該抽象模型,直接使用其字段或方法:

class Post(BaseModel):
    title = models.CharField(max_length=100)
    content = models.TextField()
  • 結果:
    • BaseModel 不會生成數據庫表。
    • Post 模型生成的數據庫表包含 created_at 和 updated_at 字段。

為什麼需要設置 abstract = True?

避免不必要的數據庫表

如果沒有設置 abstract = True,Django 將為該模型生成數據庫表。

但對於像 BaseModel 這樣的基類,這些表是多餘的,因為它們的目的是提供通用功能,而不是存儲數據。

提高邏輯重用性

抽象模型是一種 Mixin(混入)模式,可以通過繼承為多個模型提供相同的功能。

例如:

  • 自動記錄創建與更新時間(如上例的 BaseModel)。
  • 通用的圖片處理邏輯。

保持數據庫結構清晰

抽象模型不會干擾數據庫表的結構,其功能會融入繼承它的具體模型中,讓數據庫結構保持整潔,符合 Django 的設計原則。


如果不設置 abstract = True 會怎麼樣?

假如我們忘記設置 abstract = True,以下問題可能出現:

多餘的數據庫表

Django 會為這個基類創建一個不必要的數據庫表。例如,BaseModel 會被映射為一個表,但這個表不會存儲任何有效數據。

數據庫結構混亂

其他模型仍然可以繼承該類,但多了一個與業務邏輯無關的額外表,讓數據庫結構更加複雜。


應用場景

示例:通用時間戳

class TimestampMixin(models.Model):
    created_at = models.DateTimeField(auto_now_add=True)
    updated_at = models.DateTimeField(auto_now=True)

    class Meta:
        abstract = True

繼承 TimestampMixin 的模型會自動擁有 created_at 和 updated_at 字段,但 TimestampMixin 不會生成表。


示例:通用圖片處理

from utils.image_processing import convert_and_upload_to_webp

class WebPImageModelMixin(models.Model):
    def process_and_upload_image(self, image_file, folder_name):
        # 圖片處理邏輯
        pass

    class Meta:
        abstract = True

使用:

class Profile(WebPImageModelMixin, models.Model):
    photo = models.ImageField(upload_to="profile_photos/")

這樣,Profile 繼承了圖片處理邏輯,WebPImageModelMixin 不會生成表。


總結

class Meta: abstract = True 是 Django 中用來構建基類模型的強大工具,具有以下優勢:

  1. 避免不必要的數據庫表生成。
  2. 實現代碼邏輯的重用。
  3. 保持數據庫結構清晰,符合最佳設計原則。

如果你的類僅用於提供功能支持,而不是直接存儲數據,那麼這行代碼是必需的。

現在,你可以在項目中靈活運用抽象模型,讓代碼更簡潔、更高效!

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

發表留言

留言將在審核後顯示。

Python

目錄

  • 什麼是抽象模型?
  • 定義示例
  • 使用方式
  • 為什麼需要設置 abstract = True?
  • 避免不必要的數據庫表
  • 提高邏輯重用性
  • 保持數據庫結構清晰
  • 如果不設置 abstract = True 會怎麼樣?
  • 多餘的數據庫表
  • 數據庫結構混亂
  • 應用場景
  • 示例:通用時間戳
  • 示例:通用圖片處理
  • 總結