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モデルの継承構造

上記のようにCustomUserを定義することで、AbstractUserの機能をそのまま引き継ぎながらもカスタムフィールドを追加できます。AbstractUsermodels.Modelを継承しているため、Django ORMの基本メソッドをそのまま使用できます。


models.ManagerとAbstractUserManager: データベースクエリとユーザー生成ロジック

モデルのマネージャー役割を果たすmodels.Managerは、データベースに対するクエリを処理するインターフェースであり、objectsという基本マネージャーを通じてfilter()get()create()といったメソッドを使用できるようにします。CustomUserのようにユーザーモデルに特化したマネージャーが必要な場合、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

このようなマネージャーを活用することで、ユーザー生成過程で発生する可能性のあるさまざまな状況に柔軟に対応できます。AbstractUserManagermodels.Managerで拡張されているため、基本的なデータベースクエリ機能をすべて含んでいます。


Djangoモデル継承構造の理解

Djangoのモデル継承構造を理解すると、モデル設計と実装をより効率的に行うことができます。これを簡単に整理すると次のようになります:

  1. models.Model: すべてのDjangoモデルの基盤クラスであり、データベースとマッピングされながらORM機能を提供します。
  2. AbstractUser: models.Modelを継承した抽象クラス。これを継承してCustomUserを作成することで、models.Modelの機能を含んだカスタムユーザーモデルを簡単に定義できます。
  3. AbstractUserManager: models.Managerを継承したユーザー生成に特化したマネージャー。これを通じてユーザー生成ロジックを簡便にカスタマイズできます。

結論として、Djangoのモデル構造は非常に柔軟でありながら強力に設計されています。ユーザーモデルを拡張してカスタムフィールドを追加する際にも、AbstractUsermodels.Modelが提供するORM機能と構造を理解し活用することで、より効率的で拡張可能なデータベース設計が可能になります。Djangoのこのようなモデル構造をうまく活用すれば、開発者はより少ない労力で複雑なデータベースモデルを構築できます。