Python学習チャンネル by PyQ

Pythonのオンライン学習プラットフォームPyQのオフィシャルブログです

Django最新バージョン3.2(LTS)がリリースされました

f:id:kenken0326:20210428151530p:plain

こんにちは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のリリースノートをお読みください。

リリースの概要

名称Django
リリースバージョンDjango 3.2
リリース日2021年4月6日
サポートしているPython3.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.pyINSTALLED_APPS に以下のどちらかを追加する必要があります。

  1. DjangoアプリのAppConfig(実際はAppConfigのサブクラス)
  2. Djangoアプリのパッケージ

2の場合、これまではDjangoアプリの __init__.py の中で、以下のように変数 default_app_configAppConfigを記述する必要がありました。

# sample/__init__.py
default_app_config = 'sample.apps.SampleConfig'

Django 3.2からはapps.py の中にAppConfigが1つだけの場合、自動的にAppConfigが検出されるようになり、default_app_configは非推奨になりました。

なお、apps.pyの中に複数のAppConfigがある場合、AppConfigdefault属性を設定することで、デフォルトの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アプリ単位で自動生成される主キーの型を指定するには、AppConfigdefault_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へのバージョンアップを進めていくとよいでしょう。

Copyright ©2017- BeProud Inc. All rights reserved.