Python学習チャンネル by PyQ

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

Djangoの最新バージョン、Django5.2を紹介します

こんにちは。PyQサポートです。

Django 5.22025年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/

docs.djangoproject.com

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-extensionsshell_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を使って
versionnameで複合主キーを定義しています。

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

docs.djangoproject.com

Copyright ©2017- BeProud Inc. All rights reserved.