Django 5.2 リリースノート¶
2025年4月2日
Django 5.2 へようこそ!
このリリースノートでは、 バージョン 5.2 の新機能 と、Django 5.1 以前からアップグレードする際に注意すべき、 後方互換性のない変更 について説明します。また、 一部の機能を非推奨 としました。
既存のプロジェクトをアップデートするときは、 Django の新しいバージョンへの更新 ガイドに従ってください。
Django 5.2 は 長期サポートリリース として設計されています。リリースから最低3年間はセキュリティアップデートを受けます。以前の LTS である Django 4.2 に対するサポートは2026年4月に終了します。
Python バージョン間の互換性¶
Django 5.2 は、Python 3.10, 3.11, 3.12, 3.13、および 3.14 (5.2.8 時点) をサポートしています。各シリーズの最新リリースのみが 強く推奨され 、公式にサポートされています。
Django 5.2 の新機能¶
shell における自動モデルインポート¶
shell 管理コマンドは、インストール済みのすべてのアプリからモデルを自動的にインポートするようになりました。 --verbosity フラグを 2 以上に設定すると、インポートされたオブジェクトの詳細をさらに表示できます。
$ python -Wall manage.py shell --verbosity=2
6 objects imported automatically, including:
from django.contrib.admin.models import LogEntry
from django.contrib.auth.models import Group, Permission, User
from django.contrib.contenttypes.models import ContentType
from django.contrib.sessions.models import Session
...\> py -Wall manage.py shell --verbosity=2
6 objects imported automatically, including:
from django.contrib.admin.models import LogEntry
from django.contrib.auth.models import Group, Permission, User
from django.contrib.contenttypes.models import ContentType
from django.contrib.sessions.models import Session
この挙動は、自動インポートを追加または削除するように カスタマイズすることができます 。
複合主キー¶
新たに追加された django.db.models.CompositePrimaryKey により、複数のフィールドからなる主キーをテーブルに作成することができるようになりました。
複合主キーを使うには、モデルを定義する際に pk 属性を CompositePrimaryKey で設定します。
from django.db import models
class Release(models.Model):
pk = models.CompositePrimaryKey("version", "name")
version = models.IntegerField()
name = models.CharField(max_length=20)
詳細は 複合主キー を参照してください。
BoundField のオーバーライドの簡素化¶
Prior to version 5.2, overriding Field.get_bound_field() was the only
option to use a custom BoundField. Django now supports
specifying the following attributes to customize form rendering:
プロジェクト層で
BaseRenderer.bound_field_classフォーム層で
Form.bound_field_classフィールド層で
Field.bound_field_class
例えば、 Form クラスの BoundField をカスタマイズするには、下記のように実装します。
from django import forms
class CustomBoundField(forms.BoundField):
custom_class = "custom"
def css_classes(self, extra_classes=None):
result = super().css_classes(extra_classes)
if self.custom_class not in result:
result += f" {self.custom_class}"
return result.strip()
class CustomForm(forms.Form):
bound_field_class = CustomBoundField
name = forms.CharField(
label="Your Name",
max_length=100,
required=False,
widget=forms.TextInput(attrs={"class": "name-input-class"}),
)
email = forms.EmailField(label="Your Email")
CustomForm インスタンスをレンダリングする際、下記の HTML が含まれます。
<div class="custom">
<label for="id_name">Your Name:</label>
<input type="text" name="name" class="name-input-class" maxlength="100" id="id_name">
</div>
<div class="custom">
<label for="id_email">Your Email:</label>
<input type="email" name="email" maxlength="320" required="" id="id_email">
</div>
この機能の更なる詳細は BoundField のカスタマイズ を参照してください。
マイナーな機能¶
django.contrib.admin¶
admin/base.htmlテンプレートに新たなブロックとして extrabody <extrabody>`が追加されました。これにより、 ``</body>` タグの直前にカスタムコードを追加できるようになりました。URLFieldの値がリンクとしてレンダリングされるようになりました。
django.contrib.admindocs¶
docstring 内のコンポーネントへのリンクは、
:role:`リンクテキスト <link>`という形式を用いることで、カスタムのリンクテキストをサポートするようになりました。詳細は ドキュメンテーション・ヘルパー を参照してください。モデルページ は、対応する閲覧または変更権限を持つユーザーのみに制限されるようになりました。
django.contrib.auth¶
PBKDF2 パスワードハッシュに対するデフォルトのイテレーション回数が 870,000 から 1,000,000 に増加しました。
aを先頭に持つ下記の非同期メソッドが新たに追加されました。認証バックエンドは非同期実装を提供できるようになり、非同期の認証関数(例:
aauthenticate())を呼び出す際にそれらが使用され、コンテキストスイッチが減って性能が向上します。詳細は 非同期インターフェースを追加する を参照してください。パスワードバリデータクラス に新たに
get_error_message()関数が追加されました。この関数をサブクラスでオーバーライドすることで、エラーメッセージをカスタマイズできるようになりました。
django.contrib.gis¶
GDAL は、新たに追加された
OGRGeometry.has_curveプロパティ、OGRGeometry.get_linear_geometry()およびOGRGeometry.get_curve_geometry()メソッドにより、曲線ジオメトリCurvePolygon、CompoundCurve、CircularString、MultiSurface、MultiCurveをサポートするようになりました。
データベースバックエンド¶
デコレータ¶
method_decorator()が非同期ビューメソッドをサポートするようになりました。
E メール¶
EmailMessage.attachmentsとEmailMultiAlternatives.attachmentsのタプル要素は、通常のタプルではなく名前付きタプルになりました。EmailMultiAlternatives.alternativesは通常のタプルではなく名前付きタプルになりました。body_contains()メソッドが新たに追加されました。このメソッドは、メールのbodyおよび添付されたすべてのtext/*MIME タイプの代替コンテンツに指定したテキストが含まれているかどうかを示すブール値を返します。
エラー報告¶
SafeExceptionReporterFilter.hidden_settings属性は、値の名前にAUTHが含まれる場合にその値を機密情報として扱うようになりました。
フォーム¶
ColorInputが新たに追加されました。このフォームウィジェットは<input type="color" ...>でレンダリングされ、rrggbb16進数フォーマットで色を入力できます。一部のブラウザでは視覚的なカラー選択インターフェースをこの入力タイプでサポートしています。SearchInputが新たに追加されました。このフォームウィジェットは<input type="search" ...>でレンダリングされ、検索文字列を入力できます。TelInputが新たに追加されました。このフォームウィジェットは<input type="tel" ...>でレンダリングされ、電話番号を入力できます。ErrorListにfield_id引数が追加され、エラーテンプレートの HTML にid属性を追加できるようになりました。詳細はErrorList.field_idを参照してください。BoundFieldにaria_describedbyプロパティが追加され、テンプレート内でこの HTML 属性を簡単に使えるようになりました。スクリーンリーダー利用者のアクセシビリティを改善するため、フォームフィールドとそのエラーメッセージの関連付けに
aria-describedbyが使用されるようになりました。詳細は フォームエラーの表示方法 を参照してください。Scriptが新たに追加されました。このアセットオブジェクトはフォームメディア内の JavaScript にカスタム HTML 属性を追加するために利用できます。詳細は オブジェクトとしてのパス を参照してください。
管理コマンド¶
runserverを実行すると、本番環境には不向きであることを示す警告が新たに表示されるようになりました。この警告はDJANGO_RUNSERVER_HIDE_WARNING環境変数を"true"に設定することで非表示にできます。makemigrationsおよびmigrateコマンドに新たにCommand.autodetector属性が追加されました。この属性をサブクラスでオーバーライドすることで、カスタムの自動検出クラスを使用することができるようになります。BaseCommand.get_check_kwargs()メソッドが新たに追加されました。このメソッドをカスタムコマンドでオーバーライドすることで、データベース依存のチェックを有効化するなど、システムチェックの実行を制御できるようになります。
マイグレーション¶
AlterConstraintが新たに no-op 操作として追加され、データベースの制約を削除・再作成しなくても制約を変更できるようになりました。
モデル¶
QuerySet.values()とQuerySet.values_list()の使用時に生成されるSELECT句は、参照される式の指定順と一致するようになりました。従来は直感に反する一連の規則に基づいて順序が決定されていたため、QuerySet.union()などのメソッドによるクエリ結合の結果が予測しにくいものとなっていました。GeneratedFieldを使用するモデル制約のバリデーションが新たにサポートされるようになりました。Expression.set_returningが新たに追加されました。この属性は式が集合を返す関数を含むことを指定し、サブクエリの評価を強制します。これは多くの Postgres における集合を返す関数で必要となります。SQLite において、無制限の
VARCHAR列がサポートされたためCharField.max_lengthが必須でなくなりました。PostgreSQL 17以降において、
QuerySet.explain()がmemoryとserializeオプションをサポートされるようになりました。データベース関数に
JSONArrayが新たに追加されました。この関数はフィールド名または式のリストを引数に取り、これらの値を含む JSON 配列を返します。Expression.allows_composite_expressionsが新たに追加されました。この属性は複合式を許容するかどうかを指定し、例えば 複合主キー をサポートする際に使用されます。
Request と Response¶
HttpResponse.contentの文字列表現を提供するHttpResponse.textプロパティが追加されました。HttpRequest.get_preferred_type()が追加されました。この関数はクライアントが受け入れる優先メディアタイプを参照するために使用できます。HttpResponseRedirectとHttpResponsePermanentRedirectにpreserve_request引数が追加されました。この引数はそれぞれのクラスで HTTP ステータスコード 302/307 、 301/308 を使用するかどうかを決定します。redirect()にpreserve_request引数が追加されました。これにより、特定のステータスコードを用いたリダイレクト時に、ユーザーエージェントに対して HTTP メソッドと本文の再利用を指示できるようになりました。
シリアライズ (シリアル化)¶
各シリアライゼーション形式は、関数ではなく
Deserializerクラスを定義するようになりました。これは、custom serialization format を定義する際の拡張性を高めるためです。
テンプレート¶
simple_block_tag()デコレータが新たに追加されました。これにより、テンプレートの一部を受け取って使用できる単純なブロックタグの作成が可能となりました。
テスト¶
Django のカスタムアサーションに由来するスタックフレームが非表示になりました。これにより、テスト失敗の出力が読みやすくなり、
test --pdbで失敗したテストメソッドに直接入れるようになります。fixturesと serialized_rollback=True で有効化されたマイグレーションから読み込まれたデータがTransactionTestCase.setUpClass()において利用可能になりました。
URL¶
reverse()とreverse_lazy()にqueryおよびfragmentキーワード引数を受け付けるようになりました。これにより、生成される URL にそれぞれクエリ文字列および/またはフラグメント識別子を追加できるようになりました。
ユーティリティ¶
SafeStringnow returnsNotImplementedin__add__for non-string right-hand side values. This aligns with thestraddition behavior and allows__radd__to be used if available.format_html_join()は、マッピングのイテラブルを受け取り、その内容をキーワード引数としてformat_html()に渡せるようになりました。
5.2 における後方互換性のない変更¶
データベースバックエンド API¶
このセクションでは、サードパーティのデータベースバックエンドで必要になる可能性のある変更について説明します。
Model._is_pk_set()メソッドが新たに追加され、モデルインスタンスの主キーが定義されているかどうかをチェックできるようになりました。BaseDatabaseOperations.adapt_decimalfield_value()は no-op 操作となり、単に与えられた値を返すようになりました。
django.contrib.gis¶
PostGIS 3.0 に対するサポートが削除されました。
GDAL 3.0 に対するサポートが削除されました。
PostgreSQL 13 に対するサポートの削除¶
PostgreSQL 13 へのアップストリームサポートは2025年11月に終了します。 Django 5.2 では PostgreSQL 14 以降をサポートします。
MySQL 接続における文字セットの既定値の変更¶
MySQL の接続は、非推奨の文字セット utf8mb3 のエイリアスである utf8 ではなく、デフォルトで utf8mb4 文字セットを使用するようになりました。レガシーなデータベースで必要な場合は、DATABASES 設定の OPTIONS で utf8mb3 を指定できます。
その他¶
EmailMultiAlternatives.alternativesの追加はattach_alternative()メソッドでのみサポートされます。gettextの最小サポートバージョンが 0.15 から 0.19 に変更されました。HttpRequest.accepted_typesはリクエストのAcceptヘッダーに基づき、クライアントの設定によってソートされるようになりました。属性
UniqueConstraint.violation_error_codeとUniqueConstraint.violation_error_messageは指定されれば常に使用されるように変更されました。従来はUniqueConstraint.fieldsが指定されUniqueConstraint.conditionが指定されない場合に無視されていました。コンテクストプロセッサである
debug()はデフォルトのプロジェクトテンプレートには含まれなくなりました。下記のメソッドは テンプレートコンテキストをレンダリングする 際の副作用を防ぐために、
alters_data=Trueが設定されるようになりました。oracledbの最小サポートバージョンが 1.3.2 から 2.3.0 に変更されました。1つの引数のみを許容するビルトインの集合関数 (
Avg,Count,Max,Min,StdDev,Sum, andVariance) は引数の数が不適切な場合にTypeErrorを呼び出すようになりました。
5.2 で非推奨となった機能¶
その他¶
django.contrib.staticfiles.finders.find()関数のall引数は非推奨となりました。代わりにfind_all引数を使用してください。django.contrib.auth.login()およびdjango.contrib.auth.alogin()においてuserがNoneであるとき、request.userやrequest.auser()にフォールバックする挙動は非推奨となりました。PostgreSQL 特有の集合を返す関数
django.contrib.postgres.aggregates.ArrayAgg、django.contrib.postgres.aggregates.JSONBAgg、django.contrib.postgres.aggregates.StringAgg``の ``orderingキーワード引数は非推奨となりました。代わりにorder_by引数を使用してください。aprocess_request()をオーバーライドせずにprocess_request()をオーバーライドするRemoteUserMiddlewareのサブクラスのサポートが非推奨となりました。