Django 管理コマンド manage.py まとめ

#この記事について
Djangoの管理コマンドを網羅した記事がほどんど見当たらなかったので自分なりにまとめました。
環境はDjango1.11/Windows7-64/Python3.6

*※勉強不足のため効果がよくわからなかったオプションについては割愛しています。*

dumpdataが「１レコードだけ標準出力に出せる」ことがわかったのが収穫です。様々な応用が利きそうです。

#参考
- [Django公式](https://docs.djangoproject.com/en/1.11/ref/django-admin/)
- [CodeLab Django manage.pyのコマンド チートシート](https://codelab.website/django-cheat-sheet/)

#コマンド一覧
```py
manage.py

[auth]
    changepassword
    createsuperuser

[contenttypes]
    remove_stale_contenttypes

[django]
    check
    compilemessages
    createcachetable
    dbshell
    diffsettings
    dumpdata
    flush
    inspectdb
    loaddata
    makemessages
    makemigrations
    migrate
    sendtestemail
    shell
    showmigrations
    sqlflush
    sqlmigrate
    sqlsequencereset
    squashmigrations
    startapp
    startproject
    test
    testserver

[sessions]
    clearsessions

[staticfiles]
    collectstatic
    findstatic
    runserver
```

#共通オプション

 
-h, --help  
ヘルプを表示

--version
バージョン表示


-v {0,1,2,3} 
実行結果の出力レベル デフォルト１(normal)

--no-color 
ターミナル用の色情報を出力しない

--noinput, --no-input 
非対話モードで実行

--traceback 
エラー時に例外CommandErrorを発生させる。スクリプトに組み込んでエラー処理がしたいときに使う

--database DATABASE
 設定「DATABASES」に複数の指定がある場合、default以外への指定ができる。

--pythonpath PYTHONPATH
PYTHONPATHの追加指定

--settings SETTINGS 
設定ファイルを指定して実行。

## --settings 指定例
`./mypj/local_settings.py`を使ってrunserverを実行する
  `manage.py runserver --settings mypj.local_settings`

値はプロジェクトルート（manage.pyのある場所）からの相対パスで指定(.pyは不要)

設定ファイルは環境変数＝DJANGO_SETTINGS_MODULEでも指定できる

`(Windows)set DJANGO_SETTINGS_MODULE=mypj.local_settings`


#[auth]

## changepassword
ユーザー一名のパスワードを変更する

```py
usage: manage.py changepassword [-h] [--version] [-v {0,1,2,3}]
                                [--settings SETTINGS]
                                [--pythonpath PYTHONPATH] [--traceback]
                                [--no-color] [--database DATABASE]
                                [username]
```
##createsuperuser
管理者ユーザーを作成する。

```py
usage: manage.py createsuperuser [-h] [--version] [-v {0,1,2,3}]
                                 [--settings SETTINGS]
                                 [--pythonpath PYTHONPATH] [--traceback]
                                 [--no-color] [--username USERNAME]
                                 [--noinput] [--database DATABASE]
                                 [--email EMAIL]
```


設定情報をオプションから設定し非対話式で実行もできる

#[contenttypes]

##remove_stale_contenttypes
利用していないcontenttypesの削除

```py
usage: manage.py remove_stale_contenttypes [-h] [--version] [-v {0,1,2,3}]
                                           [--settings SETTINGS]
                                           [--pythonpath PYTHONPATH]
                                           [--traceback] [--no-color]
                                           [--noinput] [--database DATABASE]
```


contenttypesとは、モデルクラス間のリレーションの複雑化を抑え、相互参照を楽に行うための仕組み。
contenttypesではリレーションの設定をテーブル:django_content_typeで管理します。
このコマンドは、すでに使用されていない設定をdjango_content_typeから削除します。

[参考]
[How to Use Django's Generic Relations]
(https://simpleisbetterthancomplex.com/tutorial/2016/10/13/how-to-use-generic-relations.html)

#[django]
マイグレーション関連については別エントリを立てる予定

##check
プロジェクトの構成チェック

```py
usage: manage.py check [-h] [--version] [-v {0,1,2,3}] [--settings SETTINGS]
                       [--pythonpath PYTHONPATH] [--traceback] [--no-color]
                       [--tag TAGS] [--list-tags] [--deploy]
                       [--fail-level {CRITICAL,ERROR,WARNING,INFO,DEBUG}]
                       [app_label [app_label ...]]
```

--deploy
本番環境向けのセキュリティチェック

--tag TAGS
チェックグループ（タグ）単位での実行。デフォルトタグは--list-tagsで確認できる。
[admin, caches, compatibility, database, models, templates, urls]

app_label
アプリ名 アプリケーションを限定。指定なして全アプリケーションをチェック

runserverやmigrate 実行時に暗黙的に実行される構成チェックを単独で実行する。
チェックの単位はアプリケーションや機能グループごとでも可能
deployオプションで本番環境向けのセキュリティ適合チェックが追加される。


##compilemessages
多言語対応用の設定ファイルのコンパイル

```py
usage: manage.py compilemessages [-h] [--version] [-v {0,1,2,3}]
                                 [--settings SETTINGS]
                                 [--pythonpath PYTHONPATH] [--traceback]
                                 [--no-color] [--locale LOCALE]
                                 [--exclude EXCLUDE] [--use-fuzzy]
```


設定ファイルのフォーマットはmakemessagesで作る


##createcachetable
データベース上にキャッシュテーブルを作成する

```py
usage: manage.py createcachetable [-h] [--version] [-v {0,1,2,3}]
                                  [--settings SETTINGS]
                                  [--pythonpath PYTHONPATH] [--traceback]
                                  [--no-color] [--database DATABASE]
                                  [--dry-run]
                                  [table_name [table_name ...]]
```

[参考：Django公式 キャッシュフレームワークについて]
(http://djangoproject.jp/doc/ja/1.0/topics/cache.html#topics-cache)

##dbshell
データベース管理用のシェルを起動する

```py
usage: manage.py dbshell [-h] [--version] [-v {0,1,2,3}] [--settings SETTINGS]
                         [--pythonpath PYTHONPATH] [--traceback] [--no-color]
                         [--database DATABASE]
```


起動するシェルはデータベースのdjango.db.backends.\<dbtype>.client.DatabaseClientで指定される
シェルは事前にインストールが必要（psql,mysql,sqlplus等）


##diffsettings
設定ファイルの変更点確認

```py
usage: manage.py diffsettings [-h] [--version] [-v {0,1,2,3}]
                              [--settings SETTINGS] [--pythonpath PYTHONPATH]
                              [--traceback] [--no-color] [--all]
                              [--default MODULE] [--output {hash,unified}]
```
                              
--default MODULE
比較元となるファイルの指定
--all
設定が同じ項目も表示
--output {hash,unified}
表示形式の変更

現在の設定ファイルとデフォルトの設定ファイルを比較し、差分を表示する
設定内に関数が使われているところは評価後の値を比較する。
defaultオプションで他の設定ファイルを元に比較することもできる。


##dumpdata
データベースの内容をJSON等の形式でエクスポートする。

```py
usage: manage.py dumpdata [-h] [--version] [-v {0,1,2,3}]
                      [--settings SETTINGS] [--pythonpath PYTHONPATH]
                      [--traceback] [--no-color] [--format FORMAT]
                      [--indent INDENT] [--database DATABASE] [-e EXCLUDE]
                      [--natural-foreign] [--natural-primary] [-a]
                      [--pks PRIMARY_KEYS] [-o OUTPUT]
                      [app_label[.ModelName] [app_label[.ModelName] ...]]
```


--format
フォーマット。[XML/JSON/YAML]から選択。YAMLを使うときは追加パッケージが必要。
--indent
出力時のアウトラインフォーマット。未指定だと一行に出力される。
--exclude 
アプリor特定モデルを除外する。
--all 
全モデルを出力。（manage.pyをカスタムしてデフォルトで除外設定があっても）
--pks 
特定のキーのデータのみ出力。モデルの指定が必要
--output
出力ファイル **未指定時は標準出力に表示**

app_label 
アプリケーション名、またはモデル名を指定

出力ファイルは、loaddataのfixtureファイルとして利用する。
標準的なフォーマットで出力するので他のアプリケーションで流用できる。
標準出力に出力して目視確認やログ出力で使うこともできる（OUTPUT未指定時）。

##flush
全データ削除

```py
usage: manage.py flush [-h] [--version] [-v {0,1,2,3}] [--settings SETTINGS]
                       [--pythonpath PYTHONPATH] [--traceback] [--no-color]
                       [--noinput] [--database DATABASE]
```

マイグレーション管理など一部を除くすべてのテーブルのデータを削除。
除外オプションは無い。実行前にsqlflushでSQLをよく確認すること。

##inspectdb
現状のデータベーススキーマを元にmodelクラスを作成する。リバースエンジニアリング機能。

```py
usage: manage.py inspectdb [-h] [--version] [-v {0,1,2,3}]
                           [--settings SETTINGS] [--pythonpath PYTHONPATH]
                           [--traceback] [--no-color] [--database DATABASE]
                           [table [table ...]]
```

内容は標準出力に出る。テーブル指定が可能。

##loaddata
データベースにdumpファイルをインポート

```py
usage: manage.py loaddata [-h] [--version] [-v {0,1,2,3}]
                          [--settings SETTINGS] [--pythonpath PYTHONPATH]
                          [--traceback] [--no-color] [--database DATABASE]
                          [--app APP_LABEL] [--ignorenonexistent] [-e EXCLUDE]
                          fixture [fixture ...]
```

--app
対象アプリケーションを指定

--exclude
アプリもしくはモデルを指定除外

--ignorenonexistent
マイグレーションにおいて、対象モデル・フィールドがなくなった場合はエラーを無視してインポート

fixtureファイル(dumpdataで出力したファイル)をデータベースに読み込む。
fixtureファイルはFIXTURE_DIRSに配置するか直接パスを指定する。
圧縮ファイルにも対応している。

[参考] Django公式 
https://docs.djangoproject.com/en/1.11/ref/django-admin/#compressed-fixtures

データの読み込みはレコードレベルで行われる
・キーを持つデータが無いときは新規登録
・キーを持つデータがあるときは更新
※キーの異なる既存データはそのまま

バックアップのリストアとして利用する場合、対象テーブルは空にしておく必要がある。

## makemessages
多言語対応用の設定ファイル作成

```py
usage: manage.py makemessages [-h] [--version] [-v {0,1,2,3}]
                              [--settings SETTINGS] [--pythonpath PYTHONPATH]
                              [--traceback] [--no-color] [--locale LOCALE]
                              [--exclude EXCLUDE] [--domain DOMAIN] [--all]
                              [--extension EXTENSIONS] [--symlinks]
                              [--ignore PATTERN] [--no-default-ignore]
                              [--no-wrap] [--no-location]
                              [--add-location [{full,file,never}]]
                              [--no-obsolete] [--keep-pot]
```


##makemigrations
マイグレーションファイルの作成

```py
usage: manage.py makemigrations [-h] [--version] [-v {0,1,2,3}]
                                [--settings SETTINGS]
                                [--pythonpath PYTHONPATH] [--traceback]
                                [--no-color] [--dry-run] [--merge] [--empty]
                                [--noinput] [-n NAME] [--check]
                                [app_label [app_label ...]]
```

--dry-run
実行時のエラーの有無、マイグレーションファイル名の確認

--merge
conflictが発生している時、mergeファイルを作成する
mergeファイル：２つ以上の依存先を持つ空のマイグレーションファイル

--empty 
空のマイグレーションファイルを作成する。定義変更以外の処理を追記して使う。


##migrate
データベースにマイグレーションを適用する。

```py
usage: manage.py migrate [-h] [--version] [-v {0,1,2,3}] [--settings SETTINGS]
                         [--pythonpath PYTHONPATH] [--traceback] [--no-color]
                         [--noinput] [--database DATABASE] [--fake]
                         [--fake-initial] [--run-syncdb]
                         [app_label] [migration_name]
```

--fake 
データベースの定義変更を行わず、django_migrationテーブルに実行済みレコードを追加する。


##sendtestemail
メールの動作確認を行う

```py
usage: manage.py sendtestemail [-h] [--version] [-v {0,1,2,3}]
                               [--settings SETTINGS] [--pythonpath PYTHONPATH]
                               [--traceback] [--no-color] [--managers]
                               [--admins]
                               [email [email ...]]
```

設定ファイルのE-MAIL用設定を使って動作確認メールを送信する。
文面は定型、送信者は無し。複数のメールアドレスに送信可能

--manager 
emailの指定に加えmanagerにも送信

--admin 
emailの指定に加えadminにも送信

[参考：naritoブログ  Djangoで、メールを送信](https://torina.top/detail/278/)

[Github:django/sendtestemail.py at master django/django](https://github.com/django/django/blob/master/django/core/management/commands/sendtestemail.py)




##shell

```py
usage: manage.py shell [-h] [--version] [-v {0,1,2,3}] [--settings SETTINGS]
                       [--pythonpath PYTHONPATH] [--traceback] [--no-color]
                       [--no-startup] [-i {ipython,bpython,python}]
                       [-c COMMAND]
```

管理用のコマンドシェルを起動し対話モードに入る、もしくはオプションで指定したコマンドを直接実行する
ipythonなどのインターフェースを選択できる

--no-startup 
PYTHONSTARTUPを無視する（インターフェース未指定時）

-i {ipython,bpython,python}
インターフェースを変更する

-c COMMAND
コマンドを直接指定する

##showmigrations
マイグレーションの一覧を表示する

```py
usage: manage.py showmigrations [-h] [--version] [-v {0,1,2,3}]
                                [--settings SETTINGS]
                                [--pythonpath PYTHONPATH] [--traceback]
                                [--no-color] [--database DATABASE]
                                [--list | --plan]
                                [app_label [app_label ...]]
```

--plan 
マイグレーションファイルを適用計画順に並べ替えて表示する

各アプリのマイグレーションファイルを合わせたものが一覧として表示される。
データベースに適用済みかどうか（django_migrationsテーブルの内容と照合）は[X]マークで確認できる。


##sqlflush
flushで実行されるSQLの表示

```py
usage: manage.py sqlflush [-h] [--version] [-v {0,1,2,3}]
                          [--settings SETTINGS] [--pythonpath PYTHONPATH]
                          [--traceback] [--no-color] [--database DATABASE]
```

##sqlmigrate
migrateで実行されるSQLの表示

```py
usage: manage.py sqlmigrate [-h] [--version] [-v {0,1,2,3}]
                            [--settings SETTINGS] [--pythonpath PYTHONPATH]
                            [--traceback] [--no-color] [--database DATABASE]
                            [--backwards]
                            app_label migration_name
```

--backwards
ロールバック時に実行されるSQLを表示する


##sqlsequencereset
シーケンス情報をリセットする（１に戻す）ＳＱＬを出力する

```py
usage: manage.py sqlsequencereset [-h] [--version] [-v {0,1,2,3}]
                                  [--settings SETTINGS]
                                  [--pythonpath PYTHONPATH] [--traceback]
                                  [--no-color] [--database DATABASE]
                                  app_label [app_label ...]
```

※シーケンスに対応していないDB(例：SQLite)では何も出力されない。

##squashmigrations
複数世代のマイグレーションファイルを一つにまとめる。

```py
usage: manage.py squashmigrations [-h] [--version] [-v {0,1,2,3}]
                                  [--settings SETTINGS]
                                  [--pythonpath PYTHONPATH] [--traceback]
                                  [--no-color] [--no-optimize] [--noinput]
                                  [--squashed-name SQUASHED_NAME]
                                  app_label [start_migration_name]
                                  migration_name
```

マイグレーション名が一つの場合は最初からToまで、２つ指定した場合はFrom Toとなる。
実行後、不要マイグレーションを削除するよう忠告される。削除は手動。

##startapp
新規アプリケーションの作成

```py
usage: manage.py startapp [-h] [--version] [-v {0,1,2,3}]
                          [--settings SETTINGS] [--pythonpath PYTHONPATH]
                          [--traceback] [--no-color] [--template TEMPLATE]
                          [--extension EXTENSIONS] [--name FILES]
                          name [directory]
```

##startproject 
プロジェクトディレクトリの作成

```py
usage: manage.py startproject [-h] [--version] [-v {0,1,2,3}]
                              [--settings SETTINGS] [--pythonpath PYTHONPATH]
                              [--traceback] [--no-color] [--template TEMPLATE]
                              [--extension EXTENSIONS] [--name FILES]
                              name [directory]
```

##test
テストフレームワークの実行

```py
usage: manage.py test [-h] [--version] [-v {0,1,2,3}] [--settings SETTINGS]
                      [--pythonpath PYTHONPATH] [--traceback] [--no-color]
                      [--noinput] [--failfast] [--testrunner TESTRUNNER]
                      [-t TOP_LEVEL] [-p PATTERN] [-k] [-r] [--debug-mode]
                      [-d] [--parallel [N]] [--tag TAGS]
                      [--exclude-tag EXCLUDE_TAGS]
                      [test_label [test_label ...]]
```

勉強中なので今回は説明を割愛。いつか別エントリを立てます！

##testserver
検証用サーバを起動する。

```py
usage: manage.py testserver [-h] [--version] [-v {0,1,2,3}]
                            [--settings SETTINGS] [--pythonpath PYTHONPATH]
                            [--traceback] [--no-color] [--noinput]
                            [--addrport ADDRPORT] [--ipv6]
                            [fixture [fixture ...]]
```

指定されたfixtureを使ってrunserverとは異なるインスタンスを起動する。portを分けて複数起動可。
データベースはテスト環境利用され、データを変更しても終了時に破棄される。
現行の環境に影響させず、データ変更とかを色々試したくなった時に使う。

#[sessions]

##clearsessions
セッション情報の全削除

```py
usage: manage.py clearsessions [-h] [--version] [-v {0,1,2,3}]
                               [--settings SETTINGS] [--pythonpath PYTHONPATH]
                               [--traceback] [--no-color]
```

具体的にはdjango_sessionsのデータの全削除。

#[staticfiles]

詳細は別エントリを参照「Diangoのstaticファイルについて」
https://qiita.com/okoppe8/items/38688fa9259f261c9440

##collectstatic
staticファイルの収集

```py
usage: manage.py collectstatic [-h] [--version] [-v {0,1,2,3}]
                               [--settings SETTINGS] [--pythonpath PYTHONPATH]
                               [--traceback] [--no-color] [--noinput]
                               [--no-post-process] [-i PATTERN] [-n] [-c] [-l]
                               [--no-default-ignore]
```

##findstatic
staticファイルの存在確認

```py
usage: manage.py collectstatic [-h] [--version] [-v {0,1,2,3}]
                               [--settings SETTINGS] [--pythonpath PYTHONPATH]
                               [--traceback] [--no-color] [--noinput]
                               [--no-post-process] [-i PATTERN] [-n] [-c] [-l]
                               [--no-default-ignore]
```

##runserver
アプリケーションの起動

```py
usage: manage.py runserver [-h] [--version] [-v {0,1,2,3}]
                           [--settings SETTINGS] [--pythonpath PYTHONPATH]
                           [--traceback] [--no-color] [--ipv6] [--nothreading]
                           [--noreload] [--nostatic] [--insecure]
                           [addrport]
```

--noreload 
ソースコード変更を自動追跡してリロードする機能を停止(DEBUG=True時のみ)

--nostatic
staticファイルを直接公開する機能を停止(DEBUG=True時のみ)

--insecure
本番環境でも開発環境のように直接staticを公開させる(DEBUG=False時のみ)