allauth, CustomUserに関する仕様まとめ


今回のお題

今回はallauthやCustomUserの仕様に関してまとめます。

目的としてはアウトプットとメモ化が半々で、全体を通して見た時のテーマの一貫性はあまり感じないかもしれませんがご容赦ください。

目次

  • ユーザー情報の一意性制約について
  • フィールド初期値の変更について
  • 退会処理と一意性制約

ユーザー情報の一意性制約について

ユーザー情報の一意性制約に関しては、デフォルトではusernameはありemailはなしになっている(AbstractUserを継承した場合)。

AbstractUserの定義箇所は以下の通り。

django/contrib/auth/models.py
    username = models.CharField(
        _('username'),
        max_length=150,
        unique=True, # usernameは一意性制約あり
        help_text=_('Required. 150 characters or fewer. Letters, digits and @/./+/-/_ only.'),
        validators=[username_validator],
        error_messages={
            'unique': _("A user with that username already exists."),
        },
    )
    first_name = models.CharField(_('first name'), max_length=150, blank=True)
    last_name = models.CharField(_('last name'), max_length=150, blank=True)
    email = models.EmailField(_('email address'), blank=True) # emailは一意性制約なし

今回はサインアップおよびログイン時の要求項目は以下のように設定しているが、modelの初期値として決まっていることなので、フィールドごとの一意性制約の有無はsettigs.pyによらないものと考えられる(検証はしていません)。

settings.py
ACCOUNT_AUTHENTICATION_METHOD = "email"
ACCOUNT_USERNAME_REQUIRED = True

フィールド初期値の変更について

フィールド初期値を変更したい場合には、以下のように記述しスーパークラスの情報を上書きする。

設定していない項目(今回であればblank=True)についてはスーパークラスの情報を引き継ぐ。

models.py
class CustomUser(Abstractuser):
  email = models.EmailField(unique=True)

退会処理と一意性制約

ユーザーを物理的に削除せずに退会処理させた場合(いわゆる論理削除)には、退会済みのユーザーの情報も一意性制約の参照対象となる。

つまり一意性制約をユーザー名やメールアドレスに設定していれば、それらに関しては退会済みのユーザーとの重複も許されなくなる。

終わりに

とりあえずは以上になります。

また何かあれば追加していきます。