models.Model的角色

首先,Django中最基本的模型類是 models.Model。所有Django模型都是繼承自 models.Model 來定義的。這個類的作用是將我定義的模型映射為數據庫表。每一個模型類都是數據庫中的 ,其中的字段則是表的 列(columns)

重要的是通過繼承 models.Model 能夠獲得多個有用的方法:

  • save():將對象保存到數據庫的方法
  • delete():刪除對象的方法
  • objects.create():創建並保存新對象的方法
  • objects.filter():查詢滿足特定條件的對象的方法

得益於這些功能,只要繼承 models.Model,就能輕鬆使用Django ORM的強大功能。

AbstractUser和CustomUser的關係

Django有一個內建的用戶模型 auth.User。雖然可以直接使用這個模型,但大多數情況下用戶模型會希望進行定制。例如,想要加入電話號碼或地址等額外字段時。

此時可以使用 AbstractUser。這個類是Django提供的用戶模型(即 auth.User)的擴展用抽象類。AbstractUser 同樣繼承自 models.Model,因此當我繼承 AbstractUser 來定義 CustomUser 時,可以直接使用ORM的所有功能。

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)

這樣定義的 CustomUser 模型在提供用戶認證相關所有功能的同時,還能自由定義額外字段。

models.Manager和AbstractUserManager的角色

在Django模型中, models.Manager 扮演著處理數據庫查詢接口的角色。通過基本提供的 objects 管理器,可以輕鬆查詢或操作數據。例如有 filter()get()create() 等方法。

當用戶模型需要用戶創建邏輯時,可以使用 AbstractUserManagerAbstractUserManager 繼承自 models.Manager,並提供專門針對用戶創建的特化方法(create_user()create_superuser())。

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

透過自訂的用戶創建邏輯來實現 CustomUserManager,使得用戶模型管理更具靈活性。

整理:模型類之間的關係

到目前為止,Django的模型類之間的關係可以總結如下:

  • models.Model:所有Django模型的基礎類。通過繼承將數據庫與模型映射並提供ORM功能。
  • AbstractUser:繼承自 models.Model 的抽象類,通過擴展來定義 CustomUser
  • AbstractUserManager:繼承自 models.Manager,可對用戶創建邏輯進行定制。

了解並利用這一結構,可以更有效地設計Django的模型系統。