LoginSignup
0
1

More than 1 year has passed since last update.

【Django】settings.pyのINSTALLED_APPSとアプリケーション構成クラスとは?(3.2から推奨が変わった件も)

Posted at

概要

  • INSTALLED_APPSの記載方法について以下の2通りがありますが、django3.2から推奨の記載方法が変わっているらしいので備忘録。
    1. 明示的にアプリケーション構成クラスを書いて登録する場合
    2. アプリケーションパッケージ名を書いて登録する場合
  • 上記の記載方法に付随するエラー(警告)2件についてメモ
    • primary keyを定義しておきない、という黄色の警告文
    • INSTALLED_APPS記載漏れによるRuntimeError

環境

  • Mac
    • 機種ID:MacBookPro18,3
    • macOS:Monterey
    • チップ:Apple M1 Pro
    • メモリ:16GB
  • Django version: 4.1.3

INSTALLED_APPSとは

  • djangoプロジェクトにアプリケーションを登録する(インストールする)際に必要になるのが、INSTALLED_APPS
  • ここにアプリケーション構成クラスを設定することで、アプリケーションでの編集がプロジェクトにも反映されるようになります。
  • 例えば、mysiteプロジェクトでpollsアプリ作成時には以下がデフォルトで記載されています。
mysite/settings.py
INSTALLED_APPS = [
    'polls.apps.PollsConfig',
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
]

アプリケーション構成クラスとは

  • apps.pyにアプリケーション構成クラスが記載されています。
  • 例えば、先ほどのpollsアプリケーションでは、以下のようにデフォルトで記載されています。
polls/apps.py
from django.apps import AppConfig


class PollsConfig(AppConfig):
    default_auto_field = 'django.db.models.BigAutoField'
    name = 'polls'

INSTALLED_APPSでの登録方法は2通りある

  • INSTALLED_APPSには2通りの登録の仕方があります。上記は「明示的に登録する」場合の記載方法ですが、「アプリケーションパッケージ名で登録する」場合の記載方法もあります。
  • apps.pyには、name = 'polls'と記載がありますよね。これをそのままパッケージとして追加することができます。先ほどのpollsアプリケーションの場合、以下のように登録してあげることができます。
mysite/settings.py
INSTALLED_APPS = [
    'polls',
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
]
  • 試しに、'polls''aaaa'にすると以下のようなエラーが出てきますので、pollsだから読み込まれていることがわかりますね(もちろん、'aaaa'ではサーバーを起動しても「このサイトにアクセスできません」と表示されてしまいます)
ModuleNotFoundError: No module named 'aaaa'

_init__.pydefault_app_configの設定は不要?

  • INSTALLED_APPSで「アプリケーションパッケージ名を書く」場合の登録方法についてちょっと調べると、_init__.pyをいじってあげる必要がある、という情報もありますが、実はdjango3.2以降(2021年4月6日リリース)で設定方法の推奨が変わったようです。
  • 3.2より前の場合、Djangoアプリの__init__.pyで、変数default_app_configAppConfigを設定する必要がありました。pollsアプリの場合は以下のようになるでしょう。
polls/__init__.py
default_app_config = 'polls.apps.PollsConfig'
  • ご自身が扱っているdjangoのversionを確認した上で、プログラムを触り始めるのがいいかもしれませんね。

'django.db.models.BigAutoField'とは?

  • 上に記載したpolls/apps.pyには、default_auto_field = 'django.db.models.BigAutoField'と記載がありますが、これもDjango 3.2からアプリケーション新規作成時点で設定されるもの。
  • また、settings.pyの一番下には以下がプロジェクト作成時点でデフォルトで記載されており、プロジェクト全体の主キーフィールドを指定しています。
mysite/settings.py
DEFAULT_AUTO_FIELD = 'django.db.models.BigAutoField'

* プロジェクト全体ではなく、アプリケーションごとに主キーを指定する場合は、apps.pyAppConfigdefault_auto_field属性を設定します。

polls/apps.py
from django.apps import AppConfig


class PollsConfig(AppConfig):
    default_auto_field = 'django.db.models.BigAutoField' # ここです
    name = 'polls'

3.2にアップデートしたら表示されるようになった黄色の警告文

  • ただし、3.2から主キーの型をカスタマイズできるようになったことから、以下のような警告メッセージが黄色で表示されることがあります。
 Auto-created primary key used when not defining a primary key type, by default ‘django.db.models.AutoField’.

INSTALLED_APPSに登録していないと、migrate時にエラーが発生

  • モデルを定義しているのに、INSTALLED_APPSにアプリケーションを登録していないと、マイグレート時やrunserver時に以下のエラーが発生します。
  • pollsアプリのQuestionモデルの場合は以下のエラーメッセージです。
RuntimeError: Model class polls.models.Question doesn't declare an explicit app_label and isn't in an application in INSTALLED_APPS.
  • このエラーに遭遇した場合は、INSTALL_APPSで対象のモデルを含むアプリが登録されているかどうか確認しましょう。
0
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
1