Django 5.1 リリースノート¶
2024年8月7日
Django 5.1 へようこそ!
このリリースノートでは、 バージョン 5.1 の新機能 と、Django 5.0 以前からアップグレードする際に注意すべき、 後方互換性のない変更 について説明します。また、 一部の機能を非推奨 としました。
既存のプロジェクトをアップデートするときは、 Django の新しいバージョンへの更新 ガイドに従ってください。
Python バージョン間の互換性¶
Django 5.1 は、Python 3.10、3.11、3.12、および 3.13(5.1.3 時点)をサポートしています。 最新のリリース を使用することを強く推奨しており、公式にサポートするのも各シリーズの最新リリースのみです。
Django 5.1 の新機能¶
{% querystring %} テンプレートタグ¶
Django 5.1 では、{% querystring %} テンプレートタグが導入されました。これにより、URL 内のクエリパラメータの変更が簡略化され、既存のクエリパラメータを維持しつつ、特定の部分を追加または変更してリンクを生成するのが簡単になります。
たとえば、テンプレート内でページネーションやクエリ文字列を操作するのは面倒な場合があります。ページネーションされたビュー内で、次のページに移動するための URL を動的に生成する次のようなテンプレートフラグメントについて考えてみてください。
{# Linebreaks added for readability, this should be one, long line. #}
<a href="?{% for key, values in request.GET.iterlists %}
{% if key != "page" %}
{% for value in values %}
{{ key }}={{ value }}&
{% endfor %}
{% endif %}
{% endfor %}page={{ page.next_page_number }}">Next page</a>
これを新しいテンプレートタグを使用するように切り替えると、上記は次のように魔法のように簡略化されます。
<a href="{% querystring page=page.next_page_number %}">Next page</a>
PostgreSQL の接続プール¶
Django 5.1 では、PostgreSQL の 接続プール のサポートも導入されました。新しい接続の確立には比較的長い時間がかかる場合があるため、接続をオープンにしたままにしておくことで、レイテンシを削減できます。
psycopg で接続プールを使用するには、次のように OPTIONS 内の "pool" オプションに、ConnectionPool に渡されるディクショナリを設定するか、True にすることで ConnectionPool のデフォルトを使用します。
DATABASES = {
"default": {
"ENGINE": "django.db.backends.postgresql",
# ...
"OPTIONS": {
"pool": {
"min_size": 2,
"max_size": 4,
"timeout": 10,
}
},
},
}
デフォルトで認証を要求するミドルウェア¶
新しい LoginRequiredMiddleware は、すべての未認証リクエストをログインページにリダイレクトします。新しい login_not_required() デコレータを使用すると、ビューで未認証リクエストを許可できるようになります。
LoginRequiredMiddleware は、login_required() デコレータによって設定された login_url と redirect_field_name の値を尊重しますが、LoginRequiredMixin による login_url または redirect_field_name の設定はサポートされていません。
これを有効にするには、"django.contrib.auth.middleware.LoginRequiredMiddleware" を MIDDLEWARE 設定に追加します。
マイナーな機能¶
django.contrib.admin¶
ModelAdmin.list_displayにおいて、関連モデルのフィールドをリスト表示するために__演算子によるルックアップができるようになりました。
django.contrib.auth¶
PBKDF2 パスワードハッシュに対するデフォルトのイテレーション回数が 720,000 から 870,000 に増加しました。
OWASP の推奨に従い、
ScryptPasswordHasherのparallelismが 1 から 5 に増加しました。新しい
AdminUserCreationFormと、既存のAdminPasswordChangeFormは、フォームの保存時に使用不可のパスワードを設定することでパスワードベースの認証を無効化できるようになりました。この機能は、管理画面のユーザー作成ページやパスワード変更ページで利用可能です。login_required()、permission_required()、user_passes_test()デコレータが、非同期ビュー関数のラッピングをサポートするようになりました。ReadOnlyPasswordHashWidgetに、ユーザーパスワードのリセットボタンが含まれるようになりました。このボタンは、以前にReadOnlyPasswordHashFieldのヘルプテキストに埋め込まれていたリンクを置き換えます。これにより、UserChangeFormの全体的なアクセシビリティが向上します。
django.contrib.gis¶
SpatiaLite 5.1 以降で
BoundingCircleをサポートするようになりました。MySQL 8.0.24 以降で
Collectをサポートするようになりました。GeoIP2が、ipaddress.IPv4Addressまたはipaddress.IPv6Addressオブジェクトを使用してクエリできるようになりました。GeoIP2.country()がcontinent_code、continent_name、is_in_european_unionの値を公開するようになりました。GeoIP2.city()は、accuracy_radiusとregion_nameの値を新たに公開するようになりました。さらに、dma_codeとregionの値は、それぞれmetro_codeとregion_codeとして公開されるようになりましたが、後方互換性のために従来のキーも引き続き使用可能です。Areaは、ha単位(ヘクタール)をサポートするようになりました。新しい
OGRGeometry.is_3d属性により、ジオメトリがZ座標次元を持っているかどうかを確認できるようになりました。新しい
OGRGeometry.set_3d()メソッドにより、Z座標次元の追加および削除が可能になりました。OGRGeometry、Point、LineString、Polygon、およびGeometryCollectionとそのサブクラスは、新しいOGRGeometry.is_measured属性、mプロパティ、およびOGRGeometry.set_measured()メソッドを通じて測定ジオメトリ(Measured Geometries)をサポートするようになりました。OGRGeometry.centroidが、サポートされるすべてのジオメトリタイプで利用可能になりました。FromWKB()およびFromWKT()関数が、オプションのsrid引数をサポートするようになりました(ただし、Oracle では無視されます)。
django.contrib.postgres¶
BTreeIndexが新たにdeduplicate_itemsパラメータをサポートするようになりました。
django.contrib.sessions¶
django.contrib.sessions.backends.cached_db.SessionStoreは、キャッシュにセッション情報を保存する際に例外を処理するようになりました。新たに追加された セッションロガー を通じて、適切なエラーメッセージとそのトレースバックをログに記録します。django.contrib.sessions.backends.base.SessionBaseおよびすべての組み込みセッションエンジンが非同期APIを提供するようになりました。新しい非同期メソッドはすべてaを接頭辞に持つ名前で提供され、例えばaget()、akeys()、acycle_key()などがあります。
データベースバックエンド¶
"init_command"オプションが SQLite のOPTIONSでサポートされるようになり、接続時に設定する PRAGMA オプション を指定できるようになりました。"transaction_mode"オプションが SQLite のOPTIONSでサポートされるようになり、トランザクションの動作 を指定できるようになりました。"pool"オプションが PostgreSQL のOPTIONSでサポートされるようになり、接続プール を利用できるようになりました。
エラー報告¶
アクセシビリティ向上のため、技術的な404および500エラーページに、ヘッダー、フッター、メインコンテンツ領域に対応するHTMLランドマーク要素が使用されるようになりました。
ファイルストレージ¶
FileSystemStorageのallow_overwriteパラメータにより、既存のファイルを上書きして新しいファイルを保存できるようになりました。
フォーム¶
アクセシビリティを向上させ、スクリーンリーダーがフィールドセットとそのヘルプテキストを関連付けられるようにするため、フォームのフィールドセットに
aria-describedbyHTML属性が追加されました。
管理コマンド¶
makemigrationsコマンドが、各オペレーションのオペレーション・カテゴリを強調表示するために意味のある記号を表示するようになりました。
マイグレーション¶
新しい
Operation.category属性により、makemigrationsがオペレーションに対して意味のある記号を表示するために使用するオペレーション・カテゴリを指定できるようになりました。
モデル¶
QuerySet.explain()が PostgreSQL 16以降でgeneric_planオプションをサポートするようになりました。RowRangeは、start引数に正の整数、end引数に負の整数を受け入れるようになりました。新しい
exclusion引数がRowRangeとValueRangeに追加され、ウィンドウフレームから行、グループ、および同順位(タイ)を除外できるようになりました。QuerySet.order_by()が、アノテーションのトランスフォーム、たとえばJSONObjectのキーやArrayAggのインデックスなどによる並び替えをサポートするようになりました。F()式とOuterRef()式が、CharField、EmailField、SlugField、URLField、TextField、あるいはArrayFieldを出力する場合、スライス が可能になりました。Model.refresh_from_db()とModel.arefresh_from_db()に新しく追加されたfrom_queryset引数を使用すれば、モデルの値を再読み込みするためのクエリセットをカスタマイズできます。これにより、再読み込み前に行をロックしたり、リレーション先のオブジェクトを取得したりすることが可能になります。新しい
Expression.constraint_validation_compatible属性を使用すると、制約の検証時にその式を無視するよう指定することができます。
テンプレート¶
カスタムタグは、
Parserオブジェクトに追加のデータを設定できるようになりました。このデータはTemplateインスタンス上で利用可能になります。このようなデータは、テンプレートローダーや他のテンプレートクライアントで使用できます。テンプレートエンジン は、チェックフレームワークに既に登録されている
check()メソッドを実装するようになりました。
テスト¶
assertContains()、assertNotContains()、およびassertInHTML()は、アサーションエラーメッセージにヘイスタック(haystacks)を追加するようになりました。RequestFactory、AsyncRequestFactory、Client、およびAsyncClientクラスは、新たにquery_paramsパラメータをサポートしました。このパラメータは、クエリ文字列のキーと値を含む辞書を受け付けます。これにより、任意のHTTPメソッドに対してクエリ文字列を簡単に設定できるようになりました。self.client.post("/items/1", query_params={"action": "delete"}) await self.async_client.post("/items/1", query_params={"action": "delete"})
新しい
SimpleTestCase.assertNotInHTML()アサーションにより、指定されたHTMLヘイスタック内に特定のHTMLフラグメントが含まれていないことをテストできるようになりました。テストの独立性を確保するため、
SimpleTestCase内でスレッド内のデータベース接続が許可されなくなりました。
バリデータ¶
新しい
DomainNameValidatorは、国際化ドメイン名を含むドメイン名を検証します。また、新しいvalidate_domain_name()関数は、DomainNameValidatorのインスタンスを返します。
5.1 における後方互換性のない変更¶
django.contrib.gis¶
PostGIS 2.5 に対するサポートが削除されました。
PROJ < 6 のサポートが削除されました。
GDAL 2.4 のサポートが削除されました。
GeoIP2は、ディレクトリパスが指定された場合に、これまでのように都市データベースと国データベースの両方を開くことはなくなりました。代わりに、都市データベースが利用可能であればそちらを優先します。国データベースは都市データベースのサブセットであり、通常は両方を使用する必要はありません。同じディレクトリ内で国データベースを使用する必要がある場合は、コンストラクタに国データベースのパスを明示的に渡してください。
MariaDB 10.4 のサポートを終了しました¶
MariaDB 10.4のアップストリームサポートは2024年6月に終了します。Django 5.1はMariaDB 10.5以降をサポートします。
PostgreSQL 12 のサポートを終了しました¶
PostgreSQL 12 のアップストリーム サポートは 2024 年 11 月に終了します。Django 5.1 は PostgreSQL 13 以降をサポートします。
その他¶
アクセシビリティを向上させるために、admin サイトの changelist フィルタを
<div>タグではなく<nav>タグでレンダリングするようになりました。アクセシビリティを向上させるために、admin サイトの footer を
<div>タグではなく<footer>タグでレンダリングするようになり、さらに<div id="main">要素の下に移動しました。アクセシビリティを向上させるため、名前付きのフィールドセットで
collapseクラスを使用するModelAdmin.fieldsetsおよびInlineModelAdmin.fieldsetsに関連付けられた展開可能なウィジェットが、<details>および<summary>要素を含むようになりました。JavaScript ファイル
collapse.jsは、Django admin サイトでは不要になったので削除されました。SimpleTestCase.assertURLEqual()とassertInHTML()は": "をmsg_prefixに追加します。これにより、他のアサーションの振る舞いと一致するようになります。django.utils.text.Truncatorused bytruncatechars_htmlandtruncatewords_htmltemplate filters now useshtml.parser.HTMLParsersubclasses. This results in a more robust and faster operation, but there may be small differences in the output.ドキュメント化されていなかった
django.urls.converters.get_converter()関数が削除されました。SQLite の最小サポートバージョンが 3.27.0 から 3.31.0 に引き上げられました。
nameなしでファイルを保存した場合に、FileFieldがFieldErrorを発生させるようになりました。画像をストレージに保存した後に
ImageField.update_dimension_fields(force=True)が呼び出されなくなりました。ストレージバックエンドが画像をリサイズする場合、width_fieldとheight_fieldが実際の画像の幅と高さと一致しなくなります。asgirefの最小サポートバージョンが 3.7.0 から 3.8.1 に引き上げられました。To improve performance, the
delete_selectedadmin action now usesQuerySet.bulk_create()when creating multipleLogEntryobjects. As a result,pre_saveandpost_savesignals forLogEntryare not sent when multiple objects are deleted via this admin action.
5.1 で非推奨となった機能¶
その他¶
ModelAdmin.log_deletion()メソッドとLogEntryManager.log_action()メソッドは非推奨になりました。サブクラスは代わりにModelAdmin.log_deletions()とLogEntryManager.log_actions()を実装する必要があります。文書化されていない
django.utils.itercompat.is_iterable()関数とdjango.utils.itercompatモジュールが非推奨になりました。代わりにisinstance(..., collections.abc.Iterable)を使用してください。django.contrib.gis.geoip2.GeoIP2.coords()メソッドは非推奨になりました。代わりにdjango.contrib.gis.geoip2.GeoIP2.lon_lat()を使用してください。django.contrib.gis.geoip2.GeoIP2.open()メソッドは非推奨になりました。代わりにGeoIP2コンストラクタを使用してください。Model.save()およびModel.asave()への位置引数の引き渡しは非推奨となり、キーワードのみの引数が推奨されるようになりました。設定
django.contrib.gis.gdal.OGRGeometry.coord_dimは非推奨になりました。代わりにset_3d()を使用してください。django.urls.register_converter()による既存のコンバータのオーバーライドは非推奨になりました。CheckConstraintのcheckキーワード引数は非推奨となり、代わりにconditionが推奨されるようになりました。文書化されていない
FileSystemStorageのOS_OPEN_FLAGSプロパティは非推奨となりました。ストレージ内のファイルを上書きできるようにするには、新しいallow_overwriteオプションをTrueに設定してください。FieldCacheMixinのget_cache_name()メソッドは非推奨となり、代わりにcache_nameキャッシュプロパティが推奨されるようになりました。
5.1 で削除された機能¶
以下の機能は、非推奨サイクルの終わりに達したため、Django 5.1 で削除されます。
これらの変更の詳細、およびこれらの機能の使用を取り除く方法については、4.2 で非推奨となった機能 を参照してください。
BaseUserManager.make_random_password()メソッドは削除されました。モデルの
Meta.index_togetherオプションは削除されました。length_isテンプレートフィルタは削除されました。django.contrib.auth.hashers.SHA1PasswordHasher、django.contrib.auth.hashers.UnsaltedSHA1PasswordHasher、django.contrib.auth.hashers.UnsaltedMD5PasswordHasherは削除されました。モデルの
django.contrib.postgres.fields.CICharField、django.contrib.postgres.fields.CIEmailField、django.contrib.postgres.fields.CITextFieldは、履歴マイグレーションにおけるサポートを除いて、削除されました。django.contrib.postgres.fields.CITextミックスインは削除されました。BaseGeometryWidgetのmap_widthとmap_height属性は削除されました。SimpleTestCase.assertFormsetError()メソッドは削除されました。TransactionTestCase.assertQuerysetEqual()メソッドは削除されました。JSONFieldと関連するルックアップや式に対して、エンコードされた JSON 文字列リテラルを渡すことはサポートされなくなりました。SignerおよびTimestampSignerへの位置引数の受け渡しのサポートが削除されました。DEFAULT_FILE_STORAGEとSTATICFILES_STORAGEの設定は削除されました。django.core.files.storage.get_storage_class()関数は削除されました。