
こんにちは。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 には他にも多くの変更があります。気になる方は リリースノート をご確認ください。