【Django】プロジェクト構成を「設定」「ユーザ管理」「アプリケーション」の3つに分ける

#はじめに
Djangoプロジェクトの構成を綺麗にするために，多くの方がベストプラクティスを考え公開しています．私も自身が所属する研究室内でプロジェクトの引き継ぎを行う必要があるので，「何がどこで動いているか」をわかりやすくできないか日々模索しています．．．
今回の記事では私なりに考えて，良いかもと感じたDjangoプロジェクトの構成を紹介・提案します．

#結論
Djangoプロジェクトの構成を**「設定」「ユーザ管理」「その他のアプリケーション」の3つに分けます．**これによって管理がしやすくなると思います． 
「設定」のディレクトリ名が`_config`となっているのは特殊ですが，このディレクトリ名のおかげで設定ディレクトリが常に一番上に表示されて探す手間が省けます．（あくまで私の1アイデアであり，一般的な名前の付け方ではありません）

```sh
.
├── _config  # 設定
├── account　　 # ユーザ管理
└── apps     # その他アプリケーション群
    ├── app1
    ├── app2
    └── app3
```

#実装手順
この記事のプロジェクト構成を取り入れようと考えてくださる方に向けて実装手順を記載致します．

##環境
macOS Catalina 10.15.7
Python: 3.8.5
Django: 3.2.8

##1.設定ディレクトリ「_config」を作成する
この手順は，Djangoプロジェクトの開発状況によって変わりますので，それぞれについて手順を示します．
###初めからDjangoのプロジェクトを開発する場合

```sh
$ mkdir <projectName>
$ cd <projectName>
$ django-admin.py startproject _config .
```

###開発中のDjangoプロジェクトに反映する場合
```sh:プロジェクト構成
.
└── <settingDirName> → _config # ディレクトリ名を変更
```

```diff:./manage.py
- os.environ.setdefault('DJANGO_SETTINGS_MODULE', '<settingDirName>.settings')
+ os.environ.setdefault('DJANGO_SETTINGS_MODULE', '_config.settings')
```

```diff:./_config/settings.py
- ROOT_URLCONF = '<settingDirName>.urls'
+ ROOT_URLCONF = '_config.urls'
- WSGI_APPLICATION = '<settingDirName>.wsgi.application'
+ WSGI_APPLICATION = '_config.wsgi.application'
```

```diff:./config/asgi.py
- os.environ.setdefault('DJANGO_SETTINGS_MODULE', '<settingDirName>.settings')
+ os.environ.setdefault('DJANGO_SETTINGS_MODULE', '_config.settings')
```

```diff:./config/wsgi.py
- os.environ.setdefault('DJANGO_SETTINGS_MODULE', '<settingDirName>.settings')
+ os.environ.setdefault('DJANGO_SETTINGS_MODULE', '_config.settings')
```


##2.ユーザ管理ディレクトリ「account」を作成する
今回の記事ではあくまで**「プロジェクト構成の実装方法」のみ**を示しています．
ユーザ管理ディレクトリを作成したのち，カスタムユーザを作りたい方は[こちらの記事](https://qiita.com/gaku3601/items/9ca3695bb8b18bed5d5e)がわかりやすいので，ご覧下さい．(むしろ，プロジェクト構成だけ作ってもあまり意味ないので上記の記事を参考にしっかりカスタムユーザを作成することを推奨します．)

```sh
$ mkdir account
$ python manage.py startapp account
```
```diff:./_config/settings.py
INSTALLED_APPS = [
    ...
+   'account.apps.AccountConfig',
    ...
]

+ AUTH_USER_MODEL = 'account.User'
```

##3.「apps」ディレクトリ内にアプリケーションを作成する
ここでは「apps」ディレクトリ内に「example」アプリケーションを作成する例を示します．
まず，`example`ディレクトリを作成してから，`startapp`コマンドを実行しましょう．
ここで，`startapp`コマンドに注意が必要です．通常では`python manage.py startapp <アプリケーション名>`が一般的に使われているコマンドだと思いますが，Djangoプロジェクトのルート直下より深いディレクトリ内にアプリケーションを作成する場合は下記のようなコマンドを実行します．

```sh
$ mkdir apps
$ mkdir apps/example
$ python manage.py startapp example apps/example
```

次に，アプリケーションの登録を行えば完了です．

```python:./example/apps.py
from django.apps import AppConfig

class ExampleConfig(AppConfig):
    default_auto_field = 'django.db.models.BigAutoField'
    name = 'apps.example' #先頭にapps（アプリケーション群が入ったディレクトリの名前）をつける
```
```diff:./_config/settings.py
INSTALLED_APPS = [
    ...
+   'apps.example.apps.ExampleConfig',
    ...
]
```

##実装結果
上記の手順で，このようなDjangoプロジェクト構成ができました．

```sh
.
├── _config  # 設定
├── account　　 # ユーザ管理
└── apps     # その他アプリケーション群
    └── example # 今回作成したアプリケーション
```

#まとめ
今回の記事では，私なりのDjangoプロジェクトの構成を紹介・提案しました．私の提案の応用として`apps`ディレクトリ内でさらにアプリケーションを分類したディレクトリを作成することも考えられますね．（あまりプロジェクトが深くなりすぎると逆にわかりにくくなるのでいい塩梅にする必要がありますが．．）
Djangoプロジェクトのベストプラクティスは，この記事の主題である「プロジェクト構成」だけでなくView，Model，Templateなど様々なところで発揮されることで「誰でもわかりやすく，引き継ぎもしやすい」ものにできると思います．
みなさんも是非，ご自身が開発・実装をされる中で「このやりかた便利かも！」と感じたものを共有してください．（私が興味ありますのでw）
今回の記事は以上です．ありがとうございました！

※ご意見や疑問点などお待ちしております！

#参考
[【Django】設定ディレクトリをわかりやすく・みつけやすく](https://qiita.com/masaoguchi/items/4ab356f809d590544a4c)
[Djangoではカスタムユーザを作るべきらしい](https://qiita.com/gaku3601/items/9ca3695bb8b18bed5d5e)
[【Django】ディレクトリ構成のプラクティス + 注意点](https://qiita.com/ragnar1904/items/defab259cde73669cc6d)
[INSTALLED_APPSにAppConfigのサブクラスを設定してみた](https://thinkami.hatenablog.com/entry/2018/05/28/074909)