Django

Djangoカスタムユーザーモデルの作り方と実務での活用例

ⓘ本ページはプロモーションが含まれています

スポンサードリンク

DjangoのデフォルトUserモデルの限界とカスタマイズの必要性

デフォルトUserモデルは、ユーザー名(username)を識別子として扱う仕様です。しかし、現代のWebアプリケーションでは「メールアドレスで登録・ログイン」が当たり前となっています。さらに、プロフィール画像や所属部署などの追加情報を格納する必要性も高まっています。

メールアドレス認証の制約

デフォルトモデルはユーザー名を唯一の識別子として扱うため、メールアドレスでのログインにはカスタムが必要です。たとえば、SaaS向けサービスではユーザーが「@example.com」形式で登録するケースが多いため、認証フローの再設計が求められます。

独自フィールド追加の困難さ

既存モデルにProfileなどの関連モデルを追加することは可能ですが、ユーザー情報自体に必要なデータ(住所、誕生日)などを直接格納するにはカスタムモデルが必要です。また、Django Adminでの管理画面表示や検索条件も柔軟性が欠如します。


AbstractBaseUserとAbstractUserの選択基準

カスタムユーザーモデルを作成する際は、AbstractBaseUserAbstractUserかを選びます。両者は目的に応じた使い分けが必要です。

完全なカスタムが必要な場合

AbstractBaseUser完全にカスタマイズ可能な基底クラスで、ユーザー名とパスワード以外のすべてのフィールドを自前で定義します。例として、メールアドレスのみを識別子とする認証フローを作成する際には適しています。

既存フィールドを拡張する場合

AbstractUserデフォルトモデルに加えて独自フィールドを追加できるクラスです。たとえば、ユーザー名やパスワードの他に「住所」や「電話番号」などのフィールドを追加する場合に使われます。

比較項目 AbstractBaseUser AbstractUser
フィールドのカスタマイズ性 完全カスタム可能 一部のみ拡張可能
認証ロジックの再定義 必要 不要(デフォルト使用)
使用例 メールアドレス認証 所属部署の追加など

注意点AbstractUserを継承する場合、usernameフィールドは必須です。メールアドレス認証を行うには別途カスタムが必要です。


settings.pyでのAUTH_USER_MODEL設定手順

カスタムモデルを作成した後は、settings.pyで使用するモデルを指定します。この設定がなかった場合、DjangoはデフォルトのUserモデルを使用し、マイグレーションが失敗する可能性があります。

正しい参照方法

AUTH_USER_MODELにカスタムモデルを指定する際、アプリケーション名とモデル名を「.」でつなぐ形式で記述します。たとえば以下のような設定になります。

マイグレーション前の確認点

  • モデルファイル(例: models.py)に定義したクラス名が正しいかを確認する
  • マイグレーション作成前にmakemigrationsを実行しないこと(後述の手順で行う)

カスタムモデルのデータベースマイグレーション

カスタムモデルを定義してから、Djangoにデータベース構造を反映させる必要があります。このステップが飛ばされると、アプリケーション起動時にエラーが発生します。

makemigrationsコマンドの実行

以下のコマンドでマイグレーションファイルを作成します。

  • 作成された0001_initial.pyなどのファイルに、カスタムモデルの構造が記載されます

migrateによるDB更新

作成したマイグレーションファイルを実行して、データベースを作成します。

注意点:既存ユーザーがいる場合、このステップでは新規レコードのみが生成され、旧Userモデルのデータは移行されません(次項で詳述)


既存ユーザーデータの移行方法

既存のauth_userテーブルに格納されているユーザーをカスタムモデルへコピーするには、手動でのクエリ実行またはスクリプトによる自動処理が必要です。

データコピーのためのクエリ

以下は、auth_userからCustomUserにデータを転送する例です(メールアドレスが識別子となる場合)。

注意点passwordフィールドのハッシュ値は、デフォルトUserモデルとカスタムモデル間で互換性がないため、リセットが必要です。このリスクを無視すると、既存ユーザーがログインできなくなる可能性があるため、必ず事前に全員のパスワードを再設定してください。

データ整合性の確認手順

  1. 移行後のレコード数をCustomUser.objects.count()で確認
  2. 一意なメールアドレスが重複していないかチェック
  3. 管理画面やカスタムビューからログイン可能かテスト

実践例:認証フローのカスタマイズ

カスタムモデルを導入した後は、認証フローに合わせてUserManagerforms.pyをオーバーライドします。以下はメールアドレスをベースとした登録・ログイン機能の実装例です。

カスタム UserManager の作成

カスタムモデル用のManagerを作成し、メールアドレスでユーザーを検索する処理を定義します。

forms.py でのオーバーライド

ログイン用のAuthenticationFormをカスタムし、emailフィールドをusernameフィールドと置き換えるようにします。

注意点get_user_model()を使うことで、カスタムモデルの変更にも柔軟に対応できます。


まとめ

本記事では、Djangoでカスタムユーザーモデルを導入する理由と具体的な実装手順を解説しました。

  • デフォルトUserモデルの限界(メールアドレス認証や独自フィールド追加)
  • AbstractBaseUserAbstractUserの使い分け
  • AUTH_USER_MODELの正しく設定方法とマイグレーションフロー
  • 既存ユーザーデータの移行手順と注意点
  • 実務での認証フローのカスタマイズ事例

プロジェクトに応じた適切なモデル設計は、後々の拡張性や保守性に大きく影響します。Django カスタムユーザーモデル 作り方を理解し、実装に挑戦してください。

スポンサードリンク

-Django