Django バージョン変更点まとめ (2.1 から 6.0 まで)

 2026/05/08 -  ~

バージョン一覧

バージョン リリース日 サポート終了日 備考
6.0 2025年12月 2027年4月(予定)
5.2 2025年4月 2028年4月 LTS
5.1 2024年8月 2025年12月
5.0 2023年12月 2025年4月
4.2 2023年4月 2026年4月 LTS
4.1 2022年8月 2023年12月
4.0 2021年12月 2023年4月
3.2 2021年4月 2024年4月 LTS
3.1 2020年8月 2021年12月
3.0 2019年12月 2021年4月
2.2 2019年4月 2022年4月 LTS
2.1 2018年8月 2019年4月

Django 5.2 → 6.0

新機能

  • CSP(Content Security Policy)の組み込みサポート
  • テンプレートパーシャル{% partialdef %} / {% partial %} タグ)
  • Tasks フレームワーク(バックグラウンドタスクの組み込みサポート)
  • メール処理が Python のモダン Email API ベースに刷新

破壊的変更

Python 3.12 以上が必須。Python 3.10 / 3.11 は 5.2 が最後。

MariaDB 10.5 のサポート終了。MariaDB 10.6 以上が必要。

cx_Oracle が完全削除。Oracle DB を使っている場合は oracledb に移行する。

メール関連クラスの内部実装が変更EmailMessage / EmailMultiAlternatives のカスタムサブクラスを作っている場合は message() の戻り値の型が変わっているので要確認。


Django 5.1 → 5.2(LTS)

新機能

  • shell コマンドが全インストール済みアプリのモデルを自動インポート
  • 複合主キーのサポート改善

破壊的変更

PostgreSQL 13 のサポート終了。PostgreSQL 14 以上が必要。

MySQL のデフォルト文字コードが変更utf8utf8mb4 に変更。旧来の utf8mb3 が必要なレガシー DB は OPTIONS で明示指定が必要。

EmailMultiAlternatives.alternatives への直接追加が非サポートにattach_alternative() を使う。

# Before
msg.alternatives.append(('...', 'text/html'))

# After
msg.attach_alternative('...', 'text/html')

Django 5.0 → 5.1

新機能

  • {% querystring %} テンプレートタグが追加
  • QuerySet に acontains() 等の非同期メソッドが充実

破壊的変更

PostgreSQL 12 のサポート終了。PostgreSQL 13 以上が必要。

MariaDB 10.4 のサポート終了。MariaDB 10.5 以上が必要。

admin のフィルター HTML が変更。changelist フィルターが <div><nav> タグに変更。admin テンプレートをカスタマイズしている場合は要確認。


Django 4.2 → 5.0

新機能

  • 非同期認証関数が追加(aauthenticate() / alogin() / alogout() 等)
  • Admin の changelist でファセットカウントを表示可能に
  • フォームの <div> ベースレンダリングがデフォルトに(as_table() / as_p() は非推奨)

破壊的変更

Python 3.10 以上が必須。Python 3.8 / 3.9 は 4.2 が最後。

pytz サポートが完全削除。4.0 で追加した移行期設定 USE_DEPRECATED_PYTZ = True が使えなくなる。残っている箇所を zoneinfo に書き換える。

# Before
import pytz
tz = pytz.timezone('Asia/Tokyo')

# After
from zoneinfo import ZoneInfo
tz = ZoneInfo('Asia/Tokyo')

USE_TZ のデフォルトが True に変更。明示的に USE_TZ = False を設定していない場合、タイムゾーン対応が有効になる。

cx_Oracle が非推奨に。Oracle DB を使っている場合は oracledb への移行準備を始める(6.0 で完全削除)。


Django 4.1 → 4.2(LTS)

新機能

  • STORAGES 設定でファイルストレージを複数設定可能に
  • Admin のカラーテーマ(ライト/ダーク)を UI 上で切り替え可能に
  • InMemoryStorage クラスが追加(テスト高速化)
  • makemigrations --update オプションが追加
  • Python 3.12 のサポート追加

破壊的変更

STORAGES 設定への移行DEFAULT_FILE_STORAGESTATICFILES_STORAGE が非推奨になった。

# Before
DEFAULT_FILE_STORAGE = 'django.core.files.storage.FileSystemStorage'
STATICFILES_STORAGE = 'django.contrib.staticfiles.storage.StaticFilesStorage'

# After
STORAGES = {
    'default': {'BACKEND': 'django.core.files.storage.FileSystemStorage'},
    'staticfiles': {'BACKEND': 'django.contrib.staticfiles.storage.StaticFilesStorage'},
}

Django 4.0 → 4.1

新機能

  • クラスベースビューで非同期 HTTP ハンドラが定義可能に
  • QuerySet に非同期インターフェース追加(acreate() / aget() 等)
  • フォームが <div> ベースレンダリングに対応(as_div() 追加)

破壊的変更

Admin の検索挙動が変わった。changelist で複数の検索語を入力したとき、以前は「いずれかにマッチ」すれば返していたが、「全てにマッチ」する行だけ返すようになった。search_fields に複数フィールドを設定している admin は動作確認が必要。


Django 3.2 → 4.0

新機能

  • 非同期キャッシュ API(aget() / aset() 等)
  • USE_L10N のデフォルトが FalseTrue に変更

破壊的変更

pytz → zoneinfo への移行(最重要)zoneinfo がデフォルトのタイムゾーン実装になった。移行期の一時措置として USE_DEPRECATED_PYTZ = True を設定できるが、5.0 で削除されるため早めに対応する。

CSRF_TRUSTED_ORIGINS にスキームが必須

# Before
CSRF_TRUSTED_ORIGINS = ['.example.com']

# After
CSRF_TRUSTED_ORIGINS = ['https://*.example.com']

DeleteView の変更FormMixin を使うようになったため、カスタム削除ロジックは form_valid() に移動する。

Python 3.8 以上が必要


Django 3.1 → 3.2(LTS)

新機能

  • AppConfig 自動検出(default_app_config が不要に)
  • DEFAULT_AUTO_FIELD 設定の導入
  • Admin の @display / @action デコレーターが追加

破壊的変更

DEFAULT_AUTO_FIELD の明示設定が必要。設定しないと警告が大量に出る。既存プロジェクトは AutoField を指定する。

DEFAULT_AUTO_FIELD = 'django.db.models.AutoField'

default_app_config が非推奨__init__.py に書いていた default_app_config = '...' は削除してよい。

Python 3.6 / 3.7 のサポートが終了。Python 3.8 以上が必要。


Django 3.0 → 3.1

新機能

  • 非同期 View・ミドルウェアのサポート
  • JSONField が全 DB で使えるようになった(PostgreSQL 専用から標準化)
  • Admin 画面にナビゲーションサイドバーが追加

破壊的変更

django.contrib.postgres.fields.JSONField が非推奨。標準の django.db.models.JSONField に移行する。

# Before
from django.contrib.postgres.fields import JSONField

# After
from django.db.models import JSONField

Django 2.2 → 3.0

新機能

  • ASGI 対応(非同期アプリとして動かせるようになった)
  • MariaDB 10.1 以上を正式サポート
  • TextChoices / IntegerChoices で Enum を使った choices 定義が可能に

破壊的変更

url()path() への書き換え(必須)django.conf.urls.url() が非推奨になった。

# Before
from django.conf.urls import url
urlpatterns = [
    url(r'^articles/(?P<pk>[0-9]+)/$', views.article_detail),
]

# After
from django.urls import path
urlpatterns = [
    path('articles/<int:pk>/', views.article_detail),
]

正規表現が必要な場合は re_path() を使う。

ugettext() 系が非推奨gettext() 系に書き換える。

Python 3.5 のサポートが終了。Python 3.6 以上が必要。


Django 2.1 → 2.2(LTS)

新機能

  • CheckConstraint / UniqueConstraint で DB レベルのカスタム制約が定義可能に
  • migrate --plan オプションで実行予定のマイグレーション操作を確認可能に
  • HttpRequest.headers でリクエストヘッダに簡単アクセス可能に

破壊的変更

urlsafe_base64_encode() の戻り値が変わった。bytestring ではなく string を返すようになった。パスワードリセット周りのカスタム実装がある場合は確認する。

Group.name の最大長が変更。80 文字 → 150 文字。migration が自動生成されるので適用する。

NullBooleanSelect の option 値が変わった1/2/3unknown/true/false に変更。

依存パッケージの最小バージョン引き上げ。mysqlclient 1.3.13 以上、SQLite 3.8.3 以上、sqlparse 0.2.2 以上が必要。

非推奨(次バージョンまでに対応)

ugettext() / ugettext_lazy() 等が非推奨になった。gettext() / gettext_lazy() に書き換えておく。

# Before
from django.utils.translation import ugettext as _

# After
from django.utils.translation import gettext as _