Djangoでアプリを始めるときは必ずカスタムユーザを作る

Django
DjangoPython
0

djangoでアプリを作るとき、デフォルトで用意されているUserモデルを用いると後々面倒なことになる。
本記事ではカスタムユーザの作り方やデフォルトUserモデルからカスタムUserモデルへの移行の仕方についてまとめる。

スポンサーリンク

なぜカスタムユーザを作るのか

デフォルトのUserモデルは次のフィールドを持つ。

  • password
  • last_login
  • is_superuser
  • username
  • first_name
  • last_name
  • email
  • is_staff
  • is_active
  • date_joined

ほとんどの場合でこれらを変更したくなる。
例えば、生年月日や住所、電話番号などを追加したり。

デフォルトのUserモデルを用いて後々変更しようとすると、データベースの変更をする必要があるため外部キーや多対多の関係があればあるほど大変になる。

django公式もプロジェクトの開始時にカスタムのユーザモデルを使用することを強く推奨している。

新しくプロジェクトを始める場合は、デフォルトのUserで十分である場合でも、カスタムユーザーモデルを作成することを強く推奨します。

https://docs.djangoproject.com/ja/3.1/topics/auth/customizing/#using-a-custom-user-model-when-starting-a-project
スポンサーリンク

カスタムユーザの作り方

アプリを作り始めるときはmodels.pyに、

from django.contrib.auth.models import AbstractUser

class User(AbstractUser):
    pass

を書いてからmigrateを行うと良い。
このように書いておけばデフォルトのUserモデルと同様に動作し、必要に応じて将来的に簡単にカスタマイズすることができる。

また、モデルをアプリのadmin.pyに、次のように登録しておく。

from django.contrib import admin
from django.contrib.auth.admin import UserAdmin
from .models import User

class CustomUserAdmin(UserAdmin):
    list_display = list(UserAdmin.list_display) + ['custom_field']
    fieldsets = UserAdmin.fieldsets + (
        (None, {'fields': ('custom_field',)}),
    )
    add_fieldsets = UserAdmin.add_fieldsets + (
        (None, {'fields': ('custom_field',)}),
    )

admin.site.register(User, UserAdmin)
# fieldを追加した場合は下
admin.site.register(User, CustomUserAdmin)

詳しくはDjangoの公式を参照されたい。

AbstractUser VS AbstractBaseUser

カスタムユーザを作るときにAbstractBaseUserを継承することもできる。
これには認証機能のみ含まれ、上述したフィールドは含まれないため、完全独自のフィールドを指定することができる。
認証バックエンドをカスタムする際はこちらを使用したほうが良い。

一方でデフォルトの認証バックエンドを使用し、フィールドを追加するだけであればAbstractUserを使うと簡単に実装できる。

公式ドキュメントが詳しく説明している。

Django の認証方法のカスタマイズ | Django ドキュメント | Django

途中からカスタムUserモデルに移行する場合

Userモデルを途中から変更するのは非常に大変ではあるが、可能ではある。

Djangoのプロジェクト途中からDBを消さずにカスタムユーザーモデルへ変更する - Qiita
はじめに 業務の関係上新たにDjangoのユーザーモデルをカスタムする必要が生じたので調べてみるとプロジェクトの途中からは変更するのが難しいという情報が…… Djangoで認証用カスタムユーザモデルは途中で変更できません? ...

この記事は詳しく説明してくれている。

またdjango公式にも説明しているページがある。(分かりづらい)

#25313 (Document how to migrate from a built-in User model to a custom User model) – Django
スポンサーリンク
H-MEMO

コメント