Djangoで、アプリ用ディレクトリを作成し、INSTALLED_APPSにAppConfigのサブクラスを設定してみた

Djangoでアプリの数が増えると見づらいかなと思い、アプリ用ディレクトリを作成してみました。

その時に INSTALLED_APPSAppConfig を指定する場合で少し悩んだため、メモを残します。

 
なお、こんな感じでプロジェクトとアプリを作成しました。

# Djangoプロジェクトを作成
$ django-admin startproject myproject .

# アプリ用ディレクトリを作成
$ mkdir apps

# その中に各アプリを作成
$ cd apps/
$ python ../manage.py startapp old_style
$ python ../manage.py startapp new_style

# 比較対象として、アプリ用ディレクトリを使用しないアプリも用意
$ cd ..
$ python manage.py startapp flat_old_style_app
$ python manage.py startapp flat_new_style_app

 
この場合、Djangoプロジェクトのディレクトリ構成は以下となります。

.
├── flat_new_style_app
│   ├── __init__.py
│   ├── apps.py
│   ├── models.py
│   └── views.py
├── flat_old_style_app
│   ├── __init__.py
│   ├── apps.py
│   ├── models.py
│   └── views.py
├── manage.py
├── myproject
│   ├── __init__.py
│   ├── settings.py
│   ├── urls.py
│   └── wsgi.py
└── nest_apps
    ├── new_style
    │   ├── __init__.py
    │   ├── apps.py
    │   ├── models.py
    │   └── views.py
    └── old_style
        ├── __init__.py
        ├── apps.py
        ├── models.py
        └── views.py

 
目次

 

環境

 

設定方法

Django

  • flat_old_style_app
  • flat_new_style_app
  • nest_apps/new_style_app
  • nest_apps/old_style_app

の各アプリを使うためには、それぞれを INSTALLED_APPS に設定する必要があります。

 
設定方法は

  • an application configuration class (preferred), or
  • a package containing an application.

https://docs.djangoproject.com/ja/2.0/ref/settings/#installed-apps

とのことです。

 
AppConfigを使う方法が推奨されているようですが、今回は

  • AppConfigを指定
  • パッケージ名を指定

の両パターンを試してみます。

 
設定はsettingsに行います。

アプリ用ディレクトリがない場合は、

INSTALLED_APPS = [
    ...
    'flat_old_style_app',
    'flat_new_style_app.apps.FlatNewStyleAppConfig',
]

とします。

 
一方、アプリ用ディレクトリがある場合は、

INSTALLED_APPS = [
    ...
    'nest_apps.old_style',
    'nest_apps.new_style.apps.NewStyleConfig',
]

と、アプリ用ディレクトnest_apps も設定に含めます。

 
ただ、 AppConfigを使った設定の場合は、これだけだとmakemigrationsなどで

django.core.exceptions.ImproperlyConfigured: Cannot import 'new_style'. Check that 'nest_apps.new_style.apps.NewStyleConfig.name' is correct.

とエラーになります。

 
そこで、エラーメッセージに従いAppConfigのあるファイルを修正します (今回の場合は nest_apps/new_style/apps.py )。

変数 name に、ディレクトリ名も含めるよう変更します。

class NewStyleConfig(AppConfig):
    # name = 'new_style'
    name = 'nest_apps.new_style'

 
これで makemigrations などが動作します。

 

その他

INSTALLED_APPSにAppConfig指定が推奨されるようになったタイミングについて

AppConfigはDjango1.7から使えるようになったようです。

 
INSTALLED_APPSの説明でも、Django1.7から変更されています。

なお、文中の説明に preferred が入ったのは、Django1.9からのようです。
https://docs.djangoproject.com/en/1.9/ref/settings/#std:setting-INSTALLED_APPS

 
preferred が入ったのに合わせ、チュートリアルもDjango1.9から変更されていました。

 
細かい修正でもチュートリアルに反映されているのが良いです。

 

ソースコード

GitHubに上げました。
https://github.com/thinkAmi-sandbox/Django_AppConfig-sample

*1:公式ドキュメントでは1.6表記がなかったので、こちらを利用しました