1. Djangoにおけるユーザーの種類
DjangoはPythonを用いたWebフレームワークであり、デフォルトでユーザー認証に関する機能を備えています。大きく分けて次の2つのユーザーの種類がDjangoにはあります。
1.1. デフォルトのユーザーモデル
Djangoが提供するデフォルトのUserモデルは、django.contrib.auth.models内で定義されており、ユーザーネーム、パスワード、メールアドレス、名前(名前と姓)などの一般的なフィールドを含んでいます。
1.2. カスタムユーザーモデル
デフォルトのユーザーモデルは基本的なユーザー機能を備えていますが、すべてのプロジェクトのニーズを完全に満たすわけではありません。例えば、ユーザー名の代わりにメールアドレスを識別情報として使用したい場合や、ユーザー情報に追加のデータフィールド(社住所やプロフィール画像など)を含めたい場合などには、カスタムユーザーモデルが必要になります。
2. カスタムユーザーモデルにおける継承元
カスタムユーザーモデルを作成する際も、0から自分でユーザーモデルを作成するわけではありません。Djangoが標準で提供している抽象的なユーザーモデルを継承することで、標準の認証機能をカスタムユーザーでも利用することができます。継承元は次の2つから選択可能です。
2.1. AbstractUser
AbstractUserはDjangoが提供する抽象基底クラスで、デフォルトのUserモデルが持つ全てのフィールドとメソッド(ユーザーネーム、メールアドレス、パスワード、アクティブ状態など)を継承しています。AbstractUserは、デフォルトの認証フレームワークを大きく変更することなく、ユーザーモデルにいくつかのカスタムフィールドを追加したい場合や、特定のメソッドの動作をカスタマイズしたいが、基本的な構造は保持したい場合などに適しています。
2.2. AbstractBaseUser
AbstractBaseUserは、AbstractUserよりも柔軟な抽象基底クラスで、最も基本的な認証フレームワークのみを提供します。AbstractBaseUserは、携帯電話番号を主な認証手段として使用したい場合など、アプリケーションに特化した認証プロセスやユーザー属性を設計したい場合に適しています。
3. カスタムユーザーモデルの実装方法
具体的な実装方法を簡単に紹介します。
3.1. カスタムユーザーモデルの定義
models.py ファイルにカスタムユーザーモデルを定義します。CustomUser(AbstractUser)
というように、AbstractUserを継承し、phone_numberやprofile_imagというフィールドを追加します。
from django.contrib.auth.models import AbstractUser
class CustomUser(AbstractUser):
phone_number = models.CharField(max_length=15, unique=True, null=True)
profile_image = models.ImageField(upload_to='profile_images/', null=True, blank=True)
3.2. 設定の更新
Djangoプロジェクトの settings.py で、AUTH_USER_MODEL をカスタムユーザーモデルに設定します。
AUTH_USER_MODEL = 'your_app_name.CustomUser'
3.3. ユーザーマネージャのカスタマイズ
AbstractBaseUser を継承している場合、カスタムユーザーマネージャも必要になります。下記の例では、ユーザーの作成と認証のロジックをカスタマイズします。
from django.contrib.auth.models import BaseUserManager
class CustomUserManager(BaseUserManager):
def create_user(self, email, password=None, **extra_fields):
if not email:
raise ValueError('The Email must be set')
email = self.normalize_email(email)
user = self.model(email=email, **extra_fields)
user.set_password(password)
user.save(using=self._db)
return user
def create_superuser(self, email, password, **extra_fields):
extra_fields.setdefault('is_staff', True)
extra_fields.setdefault('is_superuser', True)
if extra_fields.get('is_staff') is not True:
raise ValueError('Superuser must have is_staff=True.')
if extra_fields.get('is_superuser') is not True:
raise ValueError('Superuser must have is_superuser=True.')
return self.create_user(email, password, **extra_fields)
まとめ
Djangoでは必要に応じて、カスタムユーザーを定義することで、標準で提供されている認証機能や管理機能を使用しながら、ユーザーに関する機能を拡張することができます。詳しくは公式ドキュメントをご覧ください。