[Django]カスタムコマンドを用いてスーパーユーザーを自動作成

django-commands-superuser-title CODE

Djangoを用いたWebアプリケーションの開発時には、manage.pyを使用したコマンドを実行する場面があると思います。

Djangoでは開発に必要な標準コマンド以外にも、独自にコマンドを作成して実行することができます。

 

この記事では、対話型シェルでスーパーユーザーを作成するcreatesuperuserコマンドをカスタマイズし、Django管理画面のスーパーユーザーをカスタムコマンド1つで作成する方法を紹介します。

 

なお、この記事で使うPython・Djangoのバージョンは以下のとおりです。

Python 3.7
Django 2.1.7

 

Djangoのデフォルトコマンド

Djangoには標準でたくさんのコマンドが付属しています。

例としてよく使用するコマンドを以下に挙げました。

python manage.py startapp app  # アプリケーションの作成
python manage.py makemigrations  # マイグレーションファイルを作る
python manage.py migrate  # データベースをマイグレートする
python manage.py createsuperuser  # スーパーユーザーを作成
python manage.py runserver  # 開発サーバーの起動
python manage.py shell  # インタラクティブShellの起動

 

他にもたくさんのコマンドが標準で使用できるので知りたい場合は、 python manage.py とタイプして確認してみてください。

 

カスタムコマンド作成方法

独自にコマンドを追加する場合は、Djangoにコマンドファイルだと認識させる必要があるため、 アプリケーション/management/commands 配下に作成したファイルを格納する必要があります。

 

commands配下にコマンドを記述する custom_createsuperuser.py を作成します。

作成後のディレクトリ構成は以下の通りです。

|
├─app
│  │  admin.py
│  │  custom_validator.py
│  │  forms.py
│  │  models.py
│  │  tests.py
│  │  __init__.py
│  │  
│  ├─management
│  │  │  __init__.py
│  │  │  
│  │  ├─commands
│  │  │  │  custom_createsuperuser.py
│  │  │  │  __init__.py
│  │  urls.py
│  │  views.py

 

次に、作成した custom_createsuperuser.py にコマンド実行時の処理を記述します。

処理内容はタイトルの通り、コマンドを実行するとスーパーユーザーのレコードがユーザーテーブルに追加されるようにします。

class User(AbstractBaseUser, PermissionsMixin):
    user_id = models.AutoField(verbose_name='ユーザーid', primary_key=True)
    username = models.CharField(_('username'), max_length=50)
    email = models.EmailField(_('email address'), unique=True, max_length=50)
    password = models.CharField(_('password'), max_length=128)

 

上記の様なユーザーモデルの場合、コマンドファイルは以下のようになります。

class Command(createsuperuser.Command):  # Django標準のcreatesuperuserコマンドを継承
    help = 'Create a superuser'  # helpコマンド実行時のコマンド概要

    def handle(self, *args, **options):  # コマンド実行時のメイン処理
        options.setdefault('interactive', False)
        username = 'admin'
        email = 'admin@admin.com'
        password = 'adminpass'
        database = options.get('database')

        user_data = {
            'username': username,
            'email': email,
            'password': password,
        }

        # 既に同じユーザー名のユーザーが存在するか確認。なければユーザー作成
        exists = self.UserModel._default_manager.db_manager(database).filter(username=username).exists()
        if not exists:
            self.UserModel._default_manager.db_manager(database).create_superuser(**user_data)

一般的なカスタムコマンドの場合は BaseCommand を継承して作成しますが、今回は標準で実行可能な createsuperuser を継承して作成しました。

 

カスタムコマンド実行

カスタムコマンドの実行は他の標準コマンドと同様に、 python manage.py コマンド名 で実行可能です。

 

python manage.py  custom_createsuperuser

作成したカスタムコマンドが実行され、スーパーユーザーがレコードに追加されました。

 

開発時にテーブルの作成と削除を複数回行う場合、このコマンドは便利なので是非使ってみてください。