こんにちは。PyQサポートです。
Django 5.2 が2025年4月2日にリリースされました。
今回のバージョンはLTS(long-term support)で、2028年4月までサポートされます。
この記事では、Django 5.2の リリースノート から、「What’s new in Django 5.2(Django 5.2 の新機能)」の内容を紹介します。
Django 5.2 の新機能は以下の3つです(カッコ内は筆者の意訳)
- Automatic models import in the shell (シェルでモデルを自動インポート)
- Composite Primary Keys (複合主キー)
- Simplified override of BoundField (BoundFieldのオーバーライドの簡素化)
また、後方互換性のない変更についても少し触れたいと思います。
Django 5.2 リリースの概要
名称 | Django |
リリースバージョン | 5.2 |
リリース予定 | 2025年4月 |
サポートしているPython | 3.10, 3.11, 3.12, 3.13 |
リリースノート(開発中) | https://docs.djangoproject.com/en/dev/releases/5.2/ |
Django 5.2 の新機能
Automatic models import in the shell (シェルでモデルを自動インポート)
Django開発中にPythonシェルを使う場合、django manage.py shell コマンドで起動します。
Django 5.2 では、Djangoアプリ内の各モデルがインポートされた状態でPythonシェルが起動するようになります。
以下のように--verbosity
を2以上に設定すると自動インポートされたモデルが表示されることを確認できます。
$ python manage.py shell --verbosity=2 6 objects imported automatically: from django.contrib.sessions.models import Session from django.contrib.contenttypes.models import ContentType from django.contrib.auth.models import User, Group, Permission from django.contrib.admin.models import LogEntry Python 3.13.1 (v3.13.1:06714517797, Dec 3 2024, 14:00:22) [Clang 15.0.0 (clang-1500.3.9.4)] on darwin Type "help", "copyright", "credits" or "license" for more information. (InteractiveConsole) >>> User.objects.all() <QuerySet []>
同様の機能は django-extensions の shell_plus にもありますが、Djangoの標準機能で使えるようになるのは嬉しいですね。
Composite Primary Keys (複合主キー)
これまで、Djangoのモデルでは複合主キーを設定することができませんでしたが、Django 5.2 で可能になります。
以下はリリースノートにあるサンプルです。
from django.db import models class Release(models.Model): pk = models.CompositePrimaryKey("version", "name") version = models.IntegerField() name = models.CharField(max_length=20)
この例では、新しく追加されたCompositePrimaryKey
を使って、
version
とname
で複合主キーを定義しています。
DB設計上、複合主キーが必要になった場合でも対応できますね。
Simplified override of BoundField (BoundFieldのオーバーライドの簡素化)
この新機能の説明のために、まずBoundField
について解説します。
BoundField
は、フォーム中の1つのフィールドのHTMLや属性にアクセスできるクラスです。
以下のフォームを例に説明します。
from django import forms class SampleForm(forms.Form): name = forms.CharField(label="name", max_length=100)
フォームのインスタンスから、たとえば以下のようにしてBoundField
にアクセスできます。
>>> form = SampleForm() >>> # name の BoundField を取得 >>> form["name"] >>> <django.forms.boundfield.BoundField object at 0x106eab130> >>> # フィールドをレンダリング >>> print(form["name"]) <input type="text" name="name" maxlength="100" required id="id_name"> >>> # フィールドの name 属性にアクセス >>> form["name"].name 'name'
このBoundField
をカスタマイズすることで、出力されるHTMLのクラス属性を設定できたりします。
そしてBoundField
を取得するとき、内部ではField.get_bound_field()
が呼ばれているため、このメソッドをオーバーライドすることでBoundField
をカスタマイズできます。
前置きが長くなりましたが、Django 5.1 まではBoundField
をカスタマイズするにはField.get_bound_field()
をオーバーライドするしかありませんでした。
また、オーバーライド可能なのも、フォームのフィールドのみでした。
Django 5.2 では、以下のようなクラス属性が追加されます。
- BaseRenderer.bound_field_class :プロジェクトレベルで
BoundField
を設定 - Form.bound_field_class : フォームレベルで
BoundField
を設定 - Field.bound_field_class : フォームのフィールドレベルで
BoundField
を設定
これらのクラス属性を設定することでBoundField
をオーバーライドできるようになりました。また、フォームのフィールドだけでなく、フォームレベルでもオーバーライドできます。
たとえば、Form.bound_field_class
を使ってフォームレベルで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 SampleForm2(forms.Form): bound_field_class = CustomBoundField name = forms.CharField(label="name", max_length=100)
上記の例では、BoundField.css_classes()
メソッドをオーバーライドしたCustomBoundField
を作成しています。
そして、これをSampleForm2.bound_field_class
に設定することで、フォームのclass属性をカスタマイズしています。
実際にフォームをレンダリングしてみましょう。
比較のために、前述のSampleForm
フォームのHTMLもレンダリングしてみます。
>>> form2 = SampleForm2() >>> print(form2) <div class="custom"> <label for="id_name">name:</label> <input type="text" name="name" maxlength="100" required id="id_name"> </div> >>> # 比較用: 前述のSampleFoemフォームのHTML >>> print(form) <div> <label for="id_name">name:</label> <input type="text" name="name" maxlength="100" required id="id_name"> </div>
SampleForm2
のHTMLは、フォーム全体を囲むdivタグの class属性がCustomBoundField
の設定通りになっていることが確認できました。
Djangoテンプレートを使っている場合、この機能を利用することでフォームをよりカスタマイズできるようになります。
より細かいフォームのカスタマイズが必要になったときに利用できそうです。
後方互換性のない変更
後方互換性のない変更の中から、DBに関する変更をピックアップして紹介します。
Dropped support for PostgreSQL 13
PostgreSQL 13は、2025年11月でサポート切れになります。
Django 5.2は、PostgreSQL 14以降をサポートします。
Changed MySQL connection character set default
MySQLへの接続のデフォルトは、非推奨の文字セット「utf8mb3」のエイリアスである「utf8」ではなく「utf8mb4」になります。
レガシーなデータベースで「utf8mb3」の設定が必要な場合、DATABASESのOPTIONSで指定できます。
まとめ
Django 5.2 の新機能と後方互換性のない変更について紹介しました。
Django 5.0 のサポートは2025年4月までなので、このバージョンを使っているプロジェクトはバージョンアップすることをおすすめします。
また、Django 4.2 (LTS) は2026年4月までサポートされますが、今からバージョンアップを計画してもよいでしょう。
Django 5.2 には他にも多くの変更があります。気になる方は リリースノート をご確認ください。