在開發 Django 應用程式時,我們最先接觸的其中一個就是繼承 models.Model 的基本資料庫模型。雖然許多教程只是單純地跟著練習,但若能更深入地了解其結構和原理,將能更有效地發揮 Django ORM 的優勢。本文將以 Django 模型的繼承結構及定義自訂使用者模型為重點,詳細探討 Django 的模型系統是如何構成的。


models.Model:所有模型的基礎類別

在 Django 中,所有的模型類別都繼承自 models.Model。這個 models.Model 類別正是與資料庫表格進行映射的角色。每個模型都是資料庫表,而模型的欄位則成為表格的列。這個基本類別提供的方法,正是使 Django ORM 核心功能得以實現的要素。

  • save():將物件儲存到資料庫
  • delete():刪除物件
  • objects.create():創建並儲存物件
  • objects.filter():查詢滿足條件的物件

僅透過繼承 models.Model 就可以自由地使用 Django 的 ORM 功能。這是 Django ORM 多麼強大設計的其中一個例證。


AbstractUser 和 CustomUser:可擴展的使用者模型

Django 預設提供 auth.User 模型,但項目中對使用者模型的擴展和自訂需求是常見的。 AbstractUser 是考慮到這種擴展性而提供的 Django 抽象使用者模型。例如,當我們想要添加電子郵件欄位,或者添加電話號碼或地址等欄位時,可以使用這個模型。

from django.contrib.auth.models import AbstractUser
from django.db import models

class CustomUser(AbstractUser):
    phone_number = models.CharField(max_length=15, blank=True)
    address = models.CharField(max_length=255, blank=True)
Django model inheritance structure

通過上述方式定義的 CustomUser,可以在保留 AbstractUser 功能的同時,添加自訂欄位。由於 AbstractUser 也繼承自 models.Model,因此可以直接使用 Django ORM 的基本方法。


models.Manager 和 AbstractUserManager:資料庫查詢和使用者創建邏輯

作為模型的管理者角色,models.Manager 是一個處理對資料庫查詢的介面,通過這個名為 objects 的基本管理者,可以使用 filter()get()create() 等方法。當需要一個專門針對使用者模型的管理者時,Django 提供了 AbstractUserManager 這個管理者類別。通過此類別,可以自訂與使用者創建相關的邏輯。

from django.contrib.auth.models import BaseUserManager

class CustomUserManager(BaseUserManager):
    def create_user(self, email, password=None, **extra_fields):
        # 使用者創建邏輯
        pass

    def create_superuser(self, email, password=None, **extra_fields):
        # 超級使用者創建邏輯
        pass

利用這種管理者,可以靈活地應對使用者創建過程中可能出現的各種情況。AbstractUserManager 也正是從 models.Manager 擴展而來,因此包含所有基本的資料庫查詢功能。


理解 Django 模型繼承結構

理解 Django 的模型繼承結構,可以使模型的設計和實現更有效率。簡單整理如下:

  1. models.Model:所有 Django 模型的基類,提供與資料庫的映射及 ORM 功能。
  2. AbstractUser:繼承自 models.Model 的抽象類別。繼承它來創建 CustomUser 將簡易地定義包含 models.Model 功能的自訂使用者模型。
  3. AbstractUserManager:繼承自 models.Manager 的專門用於使用者創建的管理者。通過它可以輕鬆自訂使用者創建邏輯。

總之,Django 的模型結構設計得十分靈活而強大。在擴充使用者模型以增加自訂欄位時,也能藉由理解與運用 AbstractUsermodels.Model 所提供的 ORM 功能與結構,實現更有效率且可擴展的資料庫設計。妥善利用 Django 的這種模型結構,可以讓開發者以更少的努力建構起複雜的資料庫模型。