DullCodes’s diary

programming,c++,python,MachineLearning,Math,Django,Competitive

初めてのDjango 16 - User モデルについて

User モデルとは

あらゆるWebサービスで使われている(であろう)User モデルの取扱い
Django においても最もよく使われるモデルの一つ
よってすでにUser モデルの雛形が用意されている

方法はだいたい4つ

  1. AbstractBaseUser を継承する(推奨)
  2. AbstractUser を継承する(推奨)
  3. 別モデルを作って OneToField で関連させる(已む無く)
  4. 自分で作る(絶賛非推奨)

Django の公式 turorial に記載されている

プロジェクトの開始時にカスタムのユーザーモデルを使用する 新しくプロジェクトを始める場合は、デフォルトの User で十分である場合でも、カスタムユーザーモデルを作成することを強く推奨します。このモデルはデフォルトのユーザーモデルと同様に動作しますが、必要に応じて将来的にカスタマイズすることができます

docs.djangoproject.com

原則的に 1, 2 の手法を取ることになる 1, 2の違いはというと

大幅に変更がある場合に1を
もとのUserモデルにちょっと手を加えるだけでいいなら2を使うと良いらしい

というわけで 今回は楽に作れる 2. AbstractUser を継承するを選択

ちなみに中身はこんな感じ
venv で仮想環境作っていればココらへんにコードが入っている
/venv/lib/python3.6/site-packages/django/contrib/auth/models.py
中身を見れば、どういうモデルなのかすごくよくわかる

実装

使い方はとっても簡単
テスト用にプロジェクトを作るところから
適当にプロジェクト、アプリ、などなど作成

$ tree TestForm/

TestForm/
├── TestForm
│   ├── __init__.py
│   ├── asgi.py
│   ├── settings.py # 修正の必要
│   ├── urls.py
│   ├── views.py
│   └── wsgi.py
├── accounts # メイン
│   ├── __init__.py
│   ├── admin.py
│   ├── apps.py
│   ├── forms.py
│   ├── migrations
│   │   ├── 0001_initial.py
│   │   ├── __init__.py
│   ├── models.py
│   ├── tests.py
│   ├── urls.py
│   └── views.py
├── db.sqlite3
├── manage.py
└── templates
    ├── accounts
    │   └── index.html
    ├── base.html

accounts/models.py

まずは User モデルの作成 AbstractUser を継承するところから始まる
AbstractUserをそのまま使うだけであれば(=AbstractUserに修正点が無いのであれば)
作るのは超かんたん



class CustomUser(AbstractUser):
    class Meta:
        db_table = 'custom_user'



from django.db import models
from django.contrib.auth.models import AbstractUser

# 継承して custom user を作る
class CustomUser(AbstractUser):
    class Meta:
    """
    Meta クラス: そのモデルに付加する情報、Meta情報を追加できる
    モデルクラスの意義である「モデルを定義すること」
    """
        # CustomUser が 作るテーブルの名前を custom_user にする
        # モデルの定義にはなんら関係ない情報だが
        # 便利だからつけている これが Meta クラスの役割
        db_table = 'custom_user'

たったこれだけで完成 もっと最小限の書き方をするなら

class CustomUser(AbstractUser):
    pass

テーブルは クラス名 にsを付けるだけになる
今回の例だと customusers

settings.py

User モデルをカスタムする時に必ず必要なセッティング

...(中略)
AUTH_USER_MODEL = 'accounts.CustomUser'

migration

このまま migration すると何故かエラーが起こるので
migrations ファイルを削除してDBも削除して初めからmigrationすると成功する
custom_user を作ると何かとバッティングしてエラーが発生するらしい
ともかく custom_user を作るなら何よりも初めに マイグレーションを行う必要がある

中身

create superuser で適当にアカウント作って python3 manage.py shell
で中身を確認

> python3 manage.shell
$$$ from django.contrib.auth import get_user_model
$$$ 
$$$ get_user_model()
$$$ <class 'accounts.models.CustomUser'>
$$$ 
$$$ get_user_model().objects.all()
$$$ <QuerySet [<CustomUser: admin>]>

まとめ

accounts/models.py に AbstractUser を継承した CustomUser したクラスを作成
settings.py に AUTH_USER_MODEL に作成したカスタム User モデルを設定
migrationファイルやDBをまっさらな状態にしてから、makemigrations する

たったこれだけで Userモデルが作成できる

次にやることは
機能的には
- Login - Logout - アカウントの作成 - アカウントの管理 - 設定の修正 - アカウントの削除 が出来ると完成