# Django 6.0の全貌:複合主キー、バックグラウンドタスク、2026年の面接対策まで徹底解説 > Django 6.0の主要新機能を徹底解説。複合主キー(CompositePrimaryKey)、組み込みバックグラウンドタスク、テンプレートパーシャル、CSPミドルウェアの実装方法と、2026年のDjango面接頻出質問を網羅します。 - Published: 2026-06-09 - Updated: 2026-06-09 - Author: SharpSkill - Tags: django, python, composite-primary-keys, background-tasks, csp - Reading time: 8 min --- Django 6.0は、Python Webフレームワークとして長年にわたり支持されてきたDjangoの最新メジャーリリースです。2025年12月に公開されたこのバージョンでは、組み込みのバックグラウンドタスクフレームワーク、テンプレートパーシャルによる再利用可能なテンプレート断片の管理、そしてネイティブなContent Security Policyミドルウェアが導入されました。さらに、Django 5.2で追加された複合主キー(Composite Primary Keys)と組み合わせることで、2026年のWeb開発に求められる堅牢かつ効率的なアーキテクチャの構築が可能になっています。 本記事では、これらの主要機能を実際のコード例とともに解説し、2026年のDjango技術面接で頻出する質問についても取り上げます。 > **2026年のDjangoバージョンタイムライン** > > Django 5.2 LTS(2025年4月)で複合主キーが導入されました。Django 6.0(2025年12月)ではバックグラウンドタスク、テンプレートパーシャル、CSPミドルウェアが追加されています。Django 6.1は現在開発中であり、Field Fetch ModesやさらなるORMの最適化が予定されています。 ## CompositePrimaryKeyによる複合主キー Djangoは18年以上にわたり、各モデルに単一カラムの主キーを強制してきました。Django 5.2では`CompositePrimaryKey`クラスの導入により、この長年の制約が解消され、ORMレベルで複数カラムによる主キーの定義が可能になりました。 複合主キーを使用することで、中間テーブルにおける人工的な`AutoField`カラムの必要性がなくなります。データベース自体が主キーレベルで一意性を保証するため、ストレージの効率化とインデックスアクセスにおけるクエリパフォーマンスの向上が期待できます。 ```python # models.py from django.db import models class Product(models.Model): name = models.CharField(max_length=100) sku = models.CharField(max_length=20, unique=True) class Warehouse(models.Model): code = models.CharField(max_length=10, primary_key=True) location = models.CharField(max_length=200) class Inventory(models.Model): pk = models.CompositePrimaryKey("product_id", "warehouse_id") product = models.ForeignKey(Product, on_delete=models.CASCADE) warehouse = models.ForeignKey(Warehouse, on_delete=models.CASCADE) quantity = models.PositiveIntegerField(default=0) last_restocked = models.DateTimeField(auto_now=True) ``` 上記の`Inventory`モデルは、データベース上で`PRIMARY KEY (product_id, warehouse_id)`制約を生成します。`id`カラムは自動生成されません。二つの外部キーの組み合わせがレコードの自然な識別子となるという、リレーショナルデータベースの標準的な設計パターンに沿ったアプローチです。 ### 複合キーによるクエリ操作 複合主キーはPythonではタプルとして表現されます。フィルタリング、アクセス、代入のすべてがこのタプルインターフェースを通じて行われます。 ```python # views.py from .models import Inventory, Product, Warehouse # Create records laptop = Product.objects.create(name="Laptop Pro", sku="LP-001") warehouse_a = Warehouse.objects.create(code="WH-A", location="Berlin") item = Inventory.objects.create( product=laptop, warehouse=warehouse_a, quantity=50 ) # Access the composite pk as a tuple print(item.pk) # (1, "WH-A") # Filter by composite pk result = Inventory.objects.filter(pk=(1, "WH-A")).first() # Assign a composite pk directly new_item = Inventory(pk=(2, "WH-B")) print(new_item.product_id) # 2 print(new_item.warehouse_id) # "WH-B" ``` 現時点で注意すべき制約が3つあります。第一に、`ForeignKey`は複合主キーを持つモデルに直接参照できないため、代わりに`ForeignObject`を使用する必要があります。第二に、Django管理画面は複合キーモデルの完全なサポートをまだ提供していません。第三に、既存のテーブルにおける単一キーと複合キー間の移行には手動SQLが必要です。 ## Django 6.0の組み込みバックグラウンドタスクフレームワーク Django 6.0以前は、リクエスト・レスポンスサイクルの外でコードを実行するには、Celery、Django-Q、またはそれに類するサードパーティのタスクキューライブラリに依存する必要がありました。Django 6.0はこのギャップを埋めるネイティブなタスクフレームワークを導入し、タスクの定義とキューイングをフレームワークコア内で直接サポートします。 `@task`デコレータは任意の関数をキューイング可能としてマークします。デコレートされた関数に対して`.enqueue()`を呼び出すことで、タスクは設定されたバックエンドに非同期実行のために送信されます。このフレームワークはタスクの定義と実行を明確に分離しています。Djangoがキューを管理し、別のワーカープロセスが実際の処理を担当する仕組みです。 ```python # tasks.py from django.tasks import task from django.core.mail import send_mail @task def send_welcome_email(user_email, username): """Send a welcome email after user registration.""" send_mail( subject="Welcome to the platform", message=f"Hello {username}, your account is ready.", from_email=None, # uses DEFAULT_FROM_EMAIL recipient_list=[user_email], ) return f"Email sent to {user_email}" @task def generate_report(report_id, format="pdf"): """Generate an export report asynchronously.""" from .services import ReportService report = ReportService.generate(report_id, format=format) return report.file_path ``` ```python # views.py from .tasks import send_welcome_email, generate_report def register_user(request): # ... user creation logic ... # Enqueue the task for background execution send_welcome_email.enqueue( user_email=user.email, username=user.username ) return redirect("dashboard") def export_view(request, report_id): generate_report.enqueue(report_id=report_id, format="csv") return JsonResponse({"status": "processing"}) ``` `settings.py`の`TASKS`設定でバックエンドを構成します。Djangoは2つの組み込みバックエンドを提供しています。Immediateバックエンドは同一プロセス内でタスクを同期的に実行するもので、ローカル開発に適しています。Dummyバックエンドはキューイングされたすべてのタスクを破棄するもので、タスクの実行を伴わずにキューイングロジックのテストを行う際に使用します。本番環境では、RedisやRabbitMQなどのメッセージブローカーに接続するサードパーティ製バックエンドまたは独自実装が必要です。 > **バックグラウンドタスク vs Celery** > > Djangoの組み込みタスクフレームワークは、Fire-and-Forget型のタスク、メール送信、レポート生成といったシンプルなユースケースに対応します。タスクチェイニング、Celery Beatによる定期実行(cron的なスケジュール)、レートリミティング、結果バックエンド、Flowerを使ったモニタリングインフラなどの高度な機能が必要な場合は、引き続きCeleryが標準的な選択肢です。両方のアプローチは同一プロジェクト内で共存できます。 ## テンプレートパーシャルによる再利用可能なフラグメント Django 6.0では`{% partialdef %}`と`{% partial %}`テンプレートタグが導入されました。これにより、単一のファイル内で名前付きの再利用可能なテンプレート断片を定義できるようになり、テンプレートディレクトリに散在する多数の小さなインクルードファイルを減らすことができます。 ```html {% partialdef product_card %}
{{ product.price|floatformat:2 }} EUR
{% if product.in_stock %}In Stock{% else %}Sold Out{% endif %}