2018年4月9日DjangoのUserモデルカスタマイズ(UUIDを使う)DjangoPythonDjangoに標準で備わるUserモデルをカスタマイズします。今回は、UUIDを利用します。環境models.pysettings.pyadmin.pyマイグレートUserモデルでUUIDを使う前回、Django標準のUserモデルをカスタマイズして、独自のユーザ認証テーブルを作成しました。今回は、UUIDを使ってidキーを改造してみます。identifier)とは、世界で重複しないIDです。Djangoでは、1.8から追加されました。UUIDFieldクラスを使うと、UUIDを扱えるフィールドをモデルに追加できます。DjangoモデルのデフォルトのプライマリーキーDjangoではモデルで特に何も指定しないと、自動でidフィールドが作成されます。このidはプライマリキーですが、型は整数(integer)で1からの連番で生成されます。こんな時にUUIDを使うWEBアプリケーションのような分散環境では、UUIDは便利です。idが数値型のままでは重複してしまう可能性がありますが、uuidであれば唯一のidが生成されますので衝突しません。IDを公開したくない場合に、推測されにくいIDを生成できます。よって、ユーザ認証情報にこれを利用してみたいと思います。IntegerField)の代わりになります。ランキングテーブルのような、大量のデータを高頻度に削除し追加する場合など、AutoFieldを使いたくない場合にUUIDFieldを使うと便利です。欠点もあります数値型のidと比べて、容量が大きくなります。DBのインデクシングやプログラミング言語で扱うときに不利な場合があります。IDの作成順がわからなくなります。2つのIDを比べてどちらが古い投稿か判断できなくなります。(これについては、created_atなどの作成日を作って対応します。以下の作業手順ですすめます。前回とほぼ同じで、models.pyにuuidフィールドを追加しました。今回の変更idの代わりにuuidを使います。usernameの代わりにemailを使います。nick_nameを追加します。emailを必須かつユニークに変更します。usernameは消します。first_nameとlast_nameを消しします。Djangoの管理画面へのログインも、usernameではなくemailとパスワードで行います。7.1.1503pyenv1.1.3-5-g7dae197Anaconda3-4.3.0MariaDB5.5.52-1.el7Apache2.4.6mod_wsgi4.5.14Django1.11.3models.pyUserモデルの継承してカスタマイズします。usernameの代わりにemailを使うようにしています。1以下のようなDjangoアプリ構成を作ります。プロジェクト名が「pj1」で、アプリケーション名が「users」です。プロジェクトの設定は済ませたものとします。赤字のファイルは、今回変更する部分です。pj1/pj1/__init__.pysettings.pyurls.pywsgi.pyusers/__init__.pyadmin.pyapps.pyurls.pyviews.pymodels.pymanage.py2usersディレクトリ配下のmodels.pyを編集します。**kwargs)解説AbstractUserのソースコードを元に作成しました。"""ユーザーマネージャー."""ここは前回と同じです。UserManagerクラスは、ユーザ名、メールアドレス、パスワードに関するメソッドを提供するBaseUserManagerを継承します。editable=False)「default=uuid.uuid4」は、モデルのオブジェクトが生成されたタイミングでuuidを自動的に割り当てます。「primary_key=True」でこのテーブルの主キーであることを示します。「editable=False」で、変更不可にします。settings.py自分で作ったUserモデルをデフォルトで使用するため宣言します。settings.pyに、以下を付け加えます。'users.User'admin.py自作のログイン画面等を使う場合はこれだけで問題ありません。デフォルトの管理画面(/admin)でこのカスタムユーザーを使う場合は、admin.pyへ処理を加える必要があります。1元々のUserモデルが使っていたusernameをemailに置き換えます。使用しているFormもカスタムユーザーに合わせたものにします。MyUserAdmin)以下のコードを参考にしました。django/django/contrib/auth/admin.pyadmin.ModelAdmin(UserAdminのスーパークラス)のカスタマイズについては、以下の記事が参考になります。管理画面逆引きメモhttps://qiita.com/zenwerk/items/044c149d93db097cdaf8マイグレート1マイグレーションファイルを作成します。makemigrations2マイグレートします。migrateusersテーブルができたか確認します。dbshell以下のような結果がでました。|+--------------+--------------+------+-----+---------+-------+3スーパーユーザを作ります。createsuperuser以下のようなプロンプトが表示されます。email、パスワード、パスワード確認を入力します。address」が最初の入力になっています。(※uuidは、自動で生成されます。successfully.4ホスト環境のブラウザから、以下のURLを入力します。http://ローカルホストのipドレス:8000/admin/以下のように、usernameを入力するフォームがメールアドレスに変わっています。