【初めてのDjango】(発展編 #02)カスタムユーザーモデルの定義、マイグレーション

本記事では「初めてのDjango(発展編)」として、初めてDjangoというフレームワークを使用してWebアプリケーションを作ってみたい!という方向けに、簡単なアプリケーションを作成しながら基本的な知識をご紹介していきます。

本シリーズの全容はこのようになっております。

今回の内容

・認証用アプリケーションの作成
・Djangoにおけるモデルとは??
・カスタムユーザーモデルの定義
・マイグレーションの仕組み、やり方

目次

認証用アプリケーションの作成

ユーザー登録を行い、会員となったユーザーのみが閲覧できるページや機能などを追加したい場合、ログイン・ログアウトといった認証機能が必要となってきます。

新米エンジニア

一気にアプリケーションぽいですね…

この認証機能をこれから実装していくのですが、他のアプリケーションからも共通で使用できるように、別のアプリケーションとして作成します。

アプリケーション作成

プロジェクトのルートディレクトリ(manage.pyがあるとこ)にて、ターミナル上で下記のコマンドを実行しましょう。

(venv_cafe)$ python manage.py startapp accounts

すると新規アプリケーション「accounts」フォルダが作成されます。

settings.pyに追加

新規アプリケーションを作成したときに行わなければならない作業があります。それは「プロジェクトにアプリケーションを追加する」という作業です。

アプリケーション作成とセットの作業ですね。

settings.py の一部を下記の一行を追加します。

INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles', 

    'cafe_app.apps.CafeAppConfig', 
    'accounts.apps.AccountsConfig',    # 追加
]

カスタムユーザーモデルについて

カスタムユーザーモデルというモデルの設定を行う前に、Djangoの認証周りの処理を実装するにあたって知っておいた方がよい知識を先に解説させていただきます。その方が「今何をやっているのか」が分かり、理解が深まると思います。

Djangoにおけるモデルとは?

一言で表すならば「Webアプリケーションにおいてデータベースとのやりとりを担うコンポーネント」です。各アプリケーション内ディレクトリ内にある models.py のことを指します。

例えばカフェの商品に関するテーブルを作成したいとします。通常、データベースにテーブルを作成したい場合はSQLを用いて作成します。

しかしDjangoにおいては、モデルにテーブルデータの内容を定義することで、作成するだけでなく追加・削除といった一連のデータベース操作を行ってくれます

例ですが、このように定義していきます。

from django.db import models

name = models.Charfield(max_length=30)
price = models.IntegerField()
description = models.Charfield(max_length=255)

詳細はここでは触れませんが、「データベースのテーブル情報を定義する」という認識で今は大丈夫です。

マイグレーション(Migrations)

モデルにテーブルの項目を定義した時点では、まだテーブルは作成されておりません。マイグレーションという処理をを行うことで、モデルに定義した情報を基にdjangoがテーブルを作成してくれます。

したがって、テーブルを作成するまでの流れは、

  1. モデル(models.py)にテーブル情報を定義する。
  2. マイグレーション

となります。

ただし厳密には「モデルクラスの定義内容をデータベース内にテーブルとして反映する」機能です。したがって、models.pyにモデルクラスを新たに作成したり、変更した場合は必ずマイグレーションする必要があります。

ユーザーモデルについて

やっと話が戻ってきました。

上記で、新しくテーブルを作成・更新したい場合は、モデルクラスに色々項目を「自分で」定義するということをお話ししました。

しかし、Djangoで認証機能を実装する場合は、ユーザーモデル(django.contrib.auth.models.User)という元々Djangoに用意されているモデルを使用します。すなわち認証に必要な項目やらが既に用意されているのです。

  • 通常のモデル → 自分で作る
  • 認証用のユーザーモデル → もともとある

またDjangoの認証の仕組みが、このユーザーモデルを使用するのです。したがって、認証というデリケートな仕組みをゼロから構築する必要はなく、このユーザーモデルを使用してDjangoが認証機能を提供してくれます。

このユーザーモデルには「ユーザー名(username)、メールアドレス(email)、…」などが項目として定義されています。こちらからも確認できます。

ところがこのユーザーモデルの欠点として、ユーザー名(username)が認証キーとして使用されている点です。したがって、この「認証キーをメールアドレスに変更したい!」といった場合は、モデル間の整合性をチェックしながら手作業で修正していく必要があります。

この問題を解決するために、自分好みにカスタマイズしたユーザーモデル、すなわちカスタムユーザーモデルを作成します。

Django公式もカスタムユーザーモデルの使用を強く推奨しております。

カスタムユーザーモデル

でも「結局自分でゼロからカスタムユーザーモデルを作るの?」と思いませんか?

実はユーザーモデルというのは、これまたDjangoに元々ある「AbstractUser」というモデルを継承して作成されています。

Githubからも分かります。

カスタムユーザーモデルを作成する際は、この「AbstractUser」を継承して作成します。

ただ単に「AbstractUser」を継承しただけだと、「User」と同じようなモデルになってしまいますので、アプリの要件に応じてフィールドやメソッドのカスタマイズを行います。

認証に使用するモデルを変更

またカスタムユーザーモデルを作成しただけでは、認証時にDjangoはまだユーザーモデルを参照してしまいます。なので、単純に、認証時に使用するモデルをカスタムユーザーモデルに変更すればよいだけです。

管理画面でのユーザーのモデルをカスタムユーザーに変更する

Djangoでは、管理画面(admin画面)にてユーザーの管理を行うことができます。デフォルトだと管理対象がユーザーーモデルなので、先ほどと同様カスタムユーザーモデルを管理するように変更してあげる必要があります。

カスタムユーザーモデルの定義

では実際に、ここまで紹介した

  • カスタムユーザーモデルの定義
  • カスタムユーザーモデルの参照
  • 管理画面(admin)にカスタムユーザーモデルを参照させる
  • マイグレーション

を行っていきます。

カスタムユーザーモデルの定義

accountsアプリケーションの models.py を下記のように修正してください。

cafe_app内のmodels.pyではないので注意です。

from django.contrib.auth.models import AbstractUser

class CustomUser(AbstractUser):
    """ カスタムユーザーモデル """

    class Meta:
        verbose_name_plural = 'CustomUser'

上記から分かるように、作成したカスタムユーザーモデル内にはほとんど中身がありません。今回のアプリケーションでは、認証機能のほとんどは「django-allauth」というライブラリを使用するためです。

Djangoにカスタムユーザーモデルを参照させる

Djangoに、認証時にカスタムユーザーモデルを参照してもらうような設定を行います。settings.py に下記を追加してください。

# 認証時にカスタムユーザーモデルを参照する
AUTH_USER_MODEL = 'accounts.CustomUser'

これでデフォルトのユーザーモデルではなく、作成したカスタムユーザーモデルを参照するようになります。

管理画面でカスタムユーザーモデルを参照させる

続いて、管理画面でもカスタムユーザーモデルを参照させます。accountsアプリケーション内の admin.py を下記のように編集します。

from django.contrib import admin

from .models import CustomUser

# 管理サイトにカスタムユーザーモデルを登録する
admin.site.register(CustomUser)

マイグレーション

最後に、ここまでに定義したモデル(カスタムユーザーモデル)の情報をデータベースに反映(マイグレーション)しましょう。

Djangoではコマンド実行するだけで、モデルの定義を読み取り自動でデータベースを更新してくれます。この作業は2段階で行います。

makemigrations

まず下記のコマンドにより、データベースへの変更内容を記したマイグレーションファイルを作成します。

(venv_cafe)$ python manage.py makemigrations

このコマンドを実行すると、プロジェクトのルートディレクトリに「migrations/0001_initioal.py」というファイルが作成されます。

この中にデータベースを更新するための情報が記述されています。

この時点ではデータベースは更新されておりません。

migrate

続いて下記のコマンドによって、先ほど作成したマイグレーションファイルを基にマイグレーションを行います。

(venv_cafe)$ python manage.py migrate

コンソールに下記のような結果が出力すれば成功です。

Operations to perform:
  Apply all migrations: accounts, admin, auth, contenttypes, sessions
Running migrations:
  Applying contenttypes.0001_initial... OK
  Applying contenttypes.0002_remove_content_type_name... OK
  Applying auth.0001_initial... OK
  Applying auth.0002_alter_permission_name_max_length... OK
  Applying auth.0003_alter_user_email_max_length... OK
  Applying auth.0004_alter_user_username_opts... OK
  Applying auth.0005_alter_user_last_login_null... OK
  Applying auth.0006_require_contenttypes_0002... OK
  Applying auth.0007_alter_validators_add_error_messages... OK
  Applying auth.0008_alter_user_username_max_length... OK
  Applying auth.0009_alter_user_last_name_max_length... OK
  Applying auth.0010_alter_group_name_max_length... OK
  Applying auth.0011_update_proxy_permissions... OK
  Applying auth.0012_alter_user_first_name_max_length... OK
  Applying accounts.0001_initial... OK
  Applying admin.0001_initial... OK
  Applying admin.0002_logentry_remove_auto_add... OK
  Applying admin.0003_logentry_add_action_flag_choices... OK
  Applying sessions.0001_initial... OK

無事マイグレーションが完了しました。

この流れを図で表すと次のようになります。

この時点でのコード全体をGithubに載せております。確認用としてお使いいただければと思います。

まとめ

本セクションでは、Djangoの認証に必要なカスタムユーザーモデルの知識や、実際に定義してマイグレーションを行うとこまでをご紹介させていただきました。

手を動かす部分は少なかったですが、重要な部分です。理解する手助けになれば幸いです。

次回は実際に「django-allauth」というパッケージを用いた認証機能を実装する方法をご紹介します!

案件、ありますか?

「メインの仕事があるけれど、週1、2日だけできる仕事ないかな、、、」

「ある程度スキルが身に付いてはきたけど、そのスキルを活用できる場が欲しい」

なんて悩みが以前はありました。

自分で仕事を探しに行くのも大事ですが、蛇の道は蛇。その道の人に頼むことで、自分だけでは見つからないような案件に携わることができます。

IT PRO パートナーズでは、簡単に無料でアカウントを登録でき、さらにはエージェントさんに希望の働き方・案件の種類を提示することでお仕事を紹介してくれます!

登録自体も非常に簡単で、「エージェントさんとの面談を希望する」という欄にチェックをするだけで、エージェントさんから直接連絡をいただくことができます。

驚くほど簡単で正直拍子抜けしてしまいました笑

もしお仕事探しに困っておりましたら、一度登録し案件を眺めてみることをおすすめします!

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

勤めていた設計会社を退社し、フリーランスとして活動しています
また、趣味で主にpyhonを用いて機械学習を行なっています!
現在競艇の予測モデルの開発中です。

コメント

コメント一覧 (6件)

コメントする

目次