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)を拡張するために作られた抽象クラスです。AbstractUsermodels.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()などのメソッドがあります。

ユーザーモデルはユーザー生成ロジックが必要な場合AbstractUserManagerを活用できます。AbstractUserManagermodels.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のモデルシステムをより効率的に設計できます。