【Django】settings.py 的 INSTALLED_APPS 和应用程序配置类是什么?(包括对于 3.2 的推荐变更)
总结
-
- INSTALLED_APPSの記載方法について以下の2通りがありますが、django3.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アプリ作成時には以下がデフォルトで記載されています。
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アプリケーションでは、以下のようにデフォルトで記載されています。
from django.apps import AppConfig
class PollsConfig(AppConfig):
default_auto_field = 'django.db.models.BigAutoField'
name = 'polls'
在INSTALLED_APPS中,有两种注册方法。
INSTALLED_APPSには2通りの登録の仕方があります。上記は「明示的に登録する」場合の記載方法ですが、「アプリケーションパッケージ名で登録する」場合の記載方法もあります。
apps.pyには、name = ‘polls’と記載がありますよね。これをそのままパッケージとして追加することができます。先ほどのpollsアプリケーションの場合、以下のように登録してあげることができます。
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__.py中,是否需要设置default_app_config?
-
- INSTALLED_APPSで「アプリケーションパッケージ名を書く」場合の登録方法についてちょっと調べると、_init__.pyをいじってあげる必要がある、という情報もありますが、実はdjango3.2以降(2021年4月6日リリース)で設定方法の推奨が変わったようです。
参考:Django最新バージョン3.2(LTS)がリリースされました
3.2より前の場合、Djangoアプリの__init__.pyで、変数default_app_configにAppConfigを設定する必要がありました。pollsアプリの場合は以下のようになるでしょう。
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の一番下には以下がプロジェクト作成時点でデフォルトで記載されており、プロジェクト全体の主キーフィールドを指定しています。
DEFAULT_AUTO_FIELD = 'django.db.models.BigAutoField'
如果不是针对整个项目,而是针对每个应用程序指定主键的话,可以在apps.py的AppConfig中设置default_auto_field属性。
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’.
自分もmigrate時にこの警告文に出会ったことがあります。djangoのバージョンを3.1以前から3.2にアップデートされた方は遭遇したことがあるかもしれません。
その場合は、settings.pyに、今まで暗黙でデフォルトとなっていたDEFAULT_AUTO_FIELD=’django.db.models.AutoField’を明示的に設定しておくと解決します。
他にも方法はあるようなので、こちらご参照ください:【django】警告文で「Auto-created primary key used when not defining a primary key type, by default ‘django.db.models.AutoField’.」の対応策
3.2変更時の公式サイトはこちら:Customizing type of auto-created primary keys¶
如果没有将其注册在INSTALLED_APPS中,在进行迁移时会发生错误。
-
- モデルを定義しているのに、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で対象のモデルを含むアプリが登録されているかどうか確認しましょう。