こんにちはPyQサポートです。
4月6日にDjango 3.2がリリースされました。
今回のバージョンはLTS(long-term support)で、2024年4月までサポートされます。
なお、以前のLTSであるDjango 2.2のサポートは2022年4月までです。
そのため、現在Django 2.2を使っている方も、今回のリリースでDjangoのバージョンアップをするタイミングが来たと言えるでしょう。
この記事ではDjango 3.2のアップデート内容の中から次の3つをご紹介します。
- AppConfigの自動検出
- 自動作成される主キーの型のカスタマイズ
- 関数インデックス
より詳しく知りたい方はDjango 3.2のリリースノートをお読みください。
- リリースの概要
- AppConfigの自動検出(Automatic AppConfig discovery)
- 自動作成される主キーの型のカスタマイズ(Customizing type of auto-created primary keys)
- 関数インデックス(Functional indexes)
- まとめ
リリースの概要
名称 | Django |
---|---|
リリースバージョン | Django 3.2 |
リリース日 | 2021年4月6日 |
サポートしているPython | 3.6、3.7、3.8、3.9 |
リリースノート | Django 3.2 release notes | Django ドキュメント | Django |
※アップデートの際はBackwords Incompatible Changes(後方互換性のない変更)に十分注意してください
AppConfigの自動検出(Automatic AppConfig discovery)
Djangoアプリの AppConfig
が自動検出されるようになり、 default_app_config
の設定が不要になりました。
簡単に背景を説明します。
DjangoプロジェクトにDjangoアプリをインストールするには、 settings.py
の INSTALLED_APPS
に以下のどちらかを追加する必要があります。
- DjangoアプリのAppConfig(実際はAppConfigのサブクラス)
- Djangoアプリのパッケージ
2の場合、これまではDjangoアプリの __init__.py
の中で、以下のように変数 default_app_config
にAppConfig
を記述する必要がありました。
# sample/__init__.py default_app_config = 'sample.apps.SampleConfig'
Django 3.2からはapps.py
の中にAppConfig
が1つだけの場合、自動的にAppConfig
が検出されるようになり、default_app_config
は非推奨になりました。
なお、apps.py
の中に複数のAppConfig
がある場合、AppConfig
のdefault
属性を設定することで、デフォルトのAppConfig
を指定できます。
自動作成される主キーの型のカスタマイズ(Customizing type of auto-created primary keys)
モデルを定義するとき、primary_key=True
を設定したフィールドがない場合は、主キーとなる id
フィールドが自動生成されます。
この自動生成される主キーの型は AutoField
ですが、Django 3.2からはこの型をカスタマイズできるようになりました。
カスタマイズ方法は2通りあります。
Djangoプロジェクト全体で指定
Djangoプロジェクト全体で自動生成される主キーの型を指定するには、settings.py
にて DEFAULT_AUTO_FIELD
を設定します。
DEFAULT_AUTO_FIELD = 'django.db.models.BigAutoField'
Djangoアプリ単位で指定
Djangoアプリ単位で自動生成される主キーの型を指定するには、AppConfig
のdefault_auto_field
属性を設定します。
# sample/apps.py class SampleConfig(AppConfig): default_auto_field = 'django.db.models.BigAutoField' name = 'sample'
Django 3.2でDjangoプロジェクトやDjangoアプリを新規作成すると、これらの項目は上記のように BigAutoField
が設定されています。
なお、現在は DEFAULT_AUTO_FIELD
のデフォルト値は AutoField
ですが、将来的には BigAutoField
がデフォルト値になるようです。
関数インデックス(Functional indexes)
Djangoのモデルでインデックスを定義するにはIndex
クラスを使用しますが、関数インデックスには対応していませんでした。
そのため、Djangoのマイグレーションで関数インデックスを作成するには、マイグレーションファイルを自分で書く必要がありましたが、Django 3.2では Index
クラスが関数インデックスに対応しました。
これにより、インデックスに式やDB関数を使用できます。
以下に簡単な例を示します。
# sample/models.py from django.db import models from django.db.models import Index from django.db.models.functions import Lower class Pet(models.Model): name = models.CharField(max_length=255) class Meta: indexes = [ Index(Lower('name'), name='lower_name_idx'), ]
この例では name
フィールドにDBの LOWER()
関数を適用したインデックスを定義しています。
たとえば以下のようなクエリを実行したとき、このインデックスが使われます。
Pet.objects.annotate(lower_name=Lower("name")).filter(lower_name="pochi")
なお、関数インデックスは使用するDBによって固有の制約があるので、詳しくはドキュメントをご確認ください。
まとめ
Django 3.2のアップデート内容の一部を紹介しましたが、今回のリリースはLTSであるということが重要かと思います。
Django 3.0以降で使いたい機能があっても、LTSバージョンのリリースまで待っていた方もあるでしょう。
これから新規にDjangoプロジェクトを作成する場合、Django 3.2が主な選択肢になると思います。
現在Django 2.2を使っているプロジェクトは、Django 3.2へのバージョンアップを進めていくとよいでしょう。