2026'da Django 6.0: Bileşik Birincil Anahtarlar, Arka Plan Görevleri ve Mülakat Soruları

Django 6.0 rehberi: bileşik birincil anahtarlar (CompositePrimaryKey), yerleşik arka plan görevleri, şablon parçaları (template partials) ve CSP desteği. Kod örnekleri ve mülakat hazırlığı dahil.

Django 6.0 bileşik birincil anahtarlar ve arka plan görevleri

Django 6.0, Aralık 2025'te yayımlanarak Python web geliştirme ekosisteminde yeni bir dönem başlattı. Django 5.2 LTS ile tanıtılan bileşik birincil anahtar desteği olgunlaşırken, 6.0 sürümü yerleşik arka plan görev sistemi, şablon parçaları (template partials) ve yerel Content Security Policy (CSP) ara katman yazılımı gibi uzun süredir beklenen özellikleri sunuyor. Bu değişiklikler, daha önce üçüncü taraf paketlere bağımlı olan kritik işlevleri doğrudan framework bünyesine taşıyarak geliştirici deneyimini önemli ölçüde iyileştiriyor.

Bu rehberde Django 6.0'ın öne çıkan özellikleri pratik kod örnekleriyle ele alınmakta ve yazının sonunda yer alan mülakat soruları teknik görüşmelere hazırlık için kapsamlı bir kaynak sunmaktadır.

Django sürüm zaman çizelgesi

Django 5.2 LTS Nisan 2025'te yayımlandı ve Nisan 2028'e kadar güvenlik güncellemesi alacak. Django 6.0, Aralık 2025'te kararlı sürüme ulaştı. Django 6.1 ise aktif geliştirme aşamasında olup 2026 sonlarında yayımlanması planlanıyor.

CompositePrimaryKey ile Bileşik Birincil Anahtarlar

Django uzun yıllar boyunca yalnızca tek sütunlu birincil anahtarları destekledi. Çok-çoğa ilişki tabloları veya envanter yönetimi gibi senaryolarda birden fazla sütunun birlikte birincil anahtar oluşturması gerektiğinde geliştiriciler ya yapay bir id alanı eklemek ya da üçüncü taraf çözümlere başvurmak zorunda kalıyordu. Django 5.2 ile tanıtılan ve 6.0'da olgunlaşan CompositePrimaryKey, bu sorunu doğrudan ORM düzeyinde çözüyor.

CompositePrimaryKey alanı, modelde pk adıyla tanımlanır ve birincil anahtarı oluşturacak alan adlarını parametre olarak alır. Aşağıdaki örnekte bir envanter sistemi modellenmiştir; Inventory tablosunun birincil anahtarı product_id ve warehouse_id sütunlarının birleşiminden oluşmaktadır.

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)

Bileşik Anahtarlarla Sorgulama

Bileşik birincil anahtar, Django ORM tarafında bir tuple (demet) olarak temsil edilir. Kayıt oluşturma, filtreleme ve doğrudan atama işlemlerinin tümü bu tuple yapısı üzerinden gerçekleştirilir. Bu yaklaşım, mevcut Django ORM paradigmasıyla tutarlı bir deneyim sunar.

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"

Bileşik birincil anahtarların bazı kısıtlamaları bulunmaktadır. Django admin paneli henüz bileşik anahtarları tam olarak desteklememekte ve GenericForeignKey gibi yapılar tek sütunlu birincil anahtar gerektirmektedir. Üçüncü taraf paketlerin uyumluluğu da sürüme göre değişiklik gösterebilir. Bu nedenle bileşik anahtarlar, ihtiyacın açıkça ortaya konduğu senaryolarda tercih edilmelidir.

Django 6.0'da Yerleşik Arka Plan Görevleri

Django 6.0'ın en dikkat çekici yeniliklerinden biri, framework bünyesine entegre edilen arka plan görev sistemidir. Daha önce e-posta gönderimi, rapor oluşturma veya bildirim işleme gibi asenkron operasyonlar için Celery, Django-RQ veya Huey gibi harici paketlere başvurmak zorunluydu. Yeni django.tasks modülü, basit ve orta düzey asenkron ihtiyaçları ek bağımlılık olmaksızın karşılıyor.

Görev tanımı @task dekoratörü ile gerçekleştirilir. Dekoratör, fonksiyonu görev olarak kayıt altına alır ve .enqueue() metoduyla kuyruğa eklenmesini sağlar.

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

Görevlerin view katmanından tetiklenmesi .enqueue() metodu aracılığıyla yapılır. Bu metod, görevi arka plan kuyruğuna ekler ve HTTP yanıtı anında döndürülür; kullanıcı görevin tamamlanmasını beklemez.

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"})

Görev arka ucu (backend), settings.py dosyasındaki TASKS ayarıyla yapılandırılır. Django, varsayılan olarak veritabanı tabanlı bir arka uç sunar; ancak Redis veya diğer mesaj aracılarını kullanan üçüncü taraf arka uçlar da entegre edilebilir.

Yerleşik görev sistemi ve Celery karşılaştırması

Django'nun yerleşik görev sistemi, basit asenkron operasyonlar (e-posta gönderimi, bildirimler, hafif raporlar) için yeterli bir çözümdür. Ancak görev yönlendirme, çoklu kuyruk yönetimi, canvas iş akışları (chain, chord, group), gelişmiş yeniden deneme stratejileri ve periyodik zamanlama (Celery Beat) gerektiren kurumsal projeler için Celery hala vazgeçilmez konumundadır. Her iki sistem bir arada kullanılabilir: basit görevler Django'nun yerleşik sistemiyle, karmaşık iş akışları Celery ile yönetilebilir.

Yeniden Kullanılabilir Şablon Parçaları (Template Partials)

Django 6.0, şablon sistemi için partialdef etiketini tanıtıyor. Bu özellik, tek bir şablon dosyası içinde birden fazla yeniden kullanılabilir parça tanımlanmasını ve bu parçaların diğer şablonlardan adlarıyla dahil edilmesini sağlıyor. Daha önceki sürümlerde her yeniden kullanılabilir bileşen için ayrı bir dosya oluşturulması gerekirken, partialdef ile ilişkili parçalar tek dosyada gruplanarak şablon organizasyonu önemli ölçüde sadeleşiyor.

Aşağıdaki örnekte bir ürün kartı ve ürün satırı olmak üzere iki parça tanımlanmıştır:

html
<!-- templates/components/cards.html -->
{% partialdef product_card %}
<div class="card">
    <h3>{{ product.name }}</h3>
    <p class="price">{{ product.price|floatformat:2 }} EUR</p>
    <span class="stock {% if product.in_stock %}available{% else %}sold-out{% endif %}">
        {% if product.in_stock %}In Stock{% else %}Sold Out{% endif %}
    </span>
</div>
{% endpartialdef %}

{% partialdef product_row %}
<tr>
    <td>{{ product.name }}</td>
    <td>{{ product.price|floatformat:2 }} EUR</td>
    <td>{{ product.quantity }}</td>
</tr>
{% endpartialdef %}

Bu parçalar, diğer şablonlardan # sözdizimi kullanılarak dahil edilir. include etiketi, dosya yolunun ardından #parça_adı eklenerek yalnızca ilgili parçayı yükler.

html
<!-- templates/shop/catalog.html -->
{% extends "base.html" %}

{% block content %}
<div class="product-grid">
    {% for product in products %}
        {% include "components/cards.html#product_card" %}
    {% endfor %}
</div>
{% endblock %}

Bu yaklaşım, HTMX gibi kütüphanelerle birlikte kullanıldığında özellikle güçlüdür. Bir AJAX isteğine yanıt olarak tam sayfa yerine yalnızca belirli bir parça döndürülebilir ve bu sayede istemci tarafı JavaScript framework'lerine ihtiyaç duymadan dinamik arayüzler oluşturulabilir.

Django mülakatlarında başarılı olmaya hazır mısın?

İnteraktif simülatörler, flashcards ve teknik testlerle pratik yap.

Yerel Content Security Policy (CSP) Ara Katman Yazılımı

Django 6.0, Content Security Policy başlıklarını yönetmek için yerel bir ara katman yazılımı sunuyor. CSP, tarayıcıya hangi kaynaklardan betik, stil, görsel ve yazı tipi yüklenmesine izin verileceğini bildiren güçlü bir güvenlik mekanizmasıdır. Daha önceki sürümlerde bu işlevsellik django-csp gibi üçüncü taraf paketler aracılığıyla sağlanıyordu.

Yapılandırma, settings.py dosyasında SECURE_CSP sözlüğü ile tanımlanır. CSP yardımcı sınıfı, yaygın direktif değerlerini sabitler olarak sunar.

python
# settings.py
from django.utils.csp import CSP

MIDDLEWARE = [
    "django.middleware.security.SecurityMiddleware",
    "django.middleware.security.ContentSecurityPolicyMiddleware",
    # ... other middleware
]

SECURE_CSP = {
    "default-src": [CSP.SELF],
    "script-src": [CSP.SELF, CSP.NONCE],
    "style-src": [CSP.SELF, "https://fonts.googleapis.com"],
    "img-src": [CSP.SELF, "https:", "data:"],
    "font-src": [CSP.SELF, "https://fonts.gstatic.com"],
    "connect-src": [CSP.SELF],
}

# Report-only mode for testing (does not block, only reports violations)
SECURE_CSP_REPORT_ONLY = {
    "default-src": [CSP.SELF],
    "report-uri": ["/csp-report/"],
}

CSP.NONCE değeri, Django'nun her istek için otomatik olarak ürettiği benzersiz bir nonce (tek kullanımlık sayı) ile değiştirilir. Şablonlarda {{ csp_nonce }} değişkeni kullanılarak satır içi betikler ve stiller bu nonce ile etiketlenir. Bu mekanizma, satır içi betiklerin çalışmasına izin verirken XSS saldırılarına karşı güçlü bir koruma katmanı sağlar. SECURE_CSP_REPORT_ONLY ayarı ise mevcut uygulamalarda CSP kurallarının kademeli olarak test edilmesini mümkün kılar; ihlaller yalnızca raporlanır, kaynaklar engellenmez.

Django 6.0'daki Diğer Önemli Değişiklikler

Bileşik anahtarlar, arka plan görevleri, şablon parçaları ve CSP desteğinin yanı sıra Django 6.0 birçok ek iyileştirme içermektedir.

BigAutoField artık tüm yeni projelerde varsayılan birincil anahtar türüdür. Bu değişiklik, büyük ölçekli uygulamalarda birincil anahtar tükenmesi riskini ortadan kaldırır. Mevcut projeler DEFAULT_AUTO_FIELD ayarı aracılığıyla geçiş yapabilir.

Asenkron sayfalama (async pagination) desteği eklenerek QuerySet.apaginate() metodu kullanıma sunulmuştur. Bu özellik, asenkron view'larda sayfalama işlemlerinin olay döngüsünü engellemeden gerçekleştirilmesini sağlar.

Django shell artık modelleri ve yaygın kullanılan modülleri otomatik olarak içe aktarır. python manage.py shell komutu çalıştırıldığında INSTALLED_APPS içindeki tüm modeller ve django.db.models, django.conf.settings gibi sık kullanılan modüller hazır olarak bulunur.

E-posta API'si modernize edilerek daha temiz ve okunabilir bir arayüz sunulmaktadır. Yeni API, e-posta oluşturma ve gönderme sürecini sadeleştirirken geriye dönük uyumluluğu korumaktadır.

2026 Django Mülakat Soruları

Aşağıdaki sorular, Django 6.0 ve ilgili kavramlar hakkında teknik mülakatlarda sıkça karşılaşılan konuları kapsamaktadır.

Soru 1: Django'da bileşik birincil anahtar (CompositePrimaryKey) ne zaman tercih edilmelidir ve kısıtlamaları nelerdir?

Bileşik birincil anahtar, iki veya daha fazla alanın birleşiminin doğal olarak benzersiz bir tanımlayıcı oluşturduğu durumlarda tercih edilir. Envanter tabloları (ürün + depo), çok-çoğa ilişki tabloları ve zaman serisi verileri (sensör + zaman damgası) tipik kullanım alanlarıdır. Kısıtlamalar arasında Django admin panelinin tam destek sunmaması, GenericForeignKey uyumsuzluğu ve bazı üçüncü taraf paketlerin tek sütunlu birincil anahtar varsayması sayılabilir. Bileşik anahtar, pk alanı üzerinden tuple olarak erişilir ve ORM sorgularında tuple filtreleme kullanılır.

Soru 2: Django 6.0'ın yerleşik görev sistemi ile Celery arasındaki temel farklar nelerdir?

Django'nun yerleşik görev sistemi, ek bağımlılık gerektirmeden basit asenkron operasyonları (e-posta, bildirim, hafif raporlar) yönetir ve veritabanı tabanlı bir arka uç sunar. Celery ise görev yönlendirme, çoklu kuyruk yönetimi, önceliklendirme, canvas iş akışları (chain, chord, group), Celery Beat ile periyodik zamanlama, sonuç depolama ve Flower ile izleme gibi gelişmiş yetenekler sunar. Hafif projeler Django'nun yerleşik sistemiyle yönetilebilirken, kurumsal düzeydeki ihtiyaçlar ve yoğun görev işleme gereksinimleri Celery'yi zorunlu kılar.

Soru 3: ContentSecurityPolicyMiddleware nasıl çalışır ve nonce mekanizması neden önemlidir?

ContentSecurityPolicyMiddleware, her HTTP yanıtına Content-Security-Policy başlığı ekleyerek tarayıcıya hangi kaynak türlerinin hangi kaynaklardan yüklenmesine izin verileceğini bildirir. Nonce mekanizması, her istek için benzersiz bir kriptografik değer üreterek yalnızca bu değerle etiketlenmiş satır içi betiklerin çalışmasına izin verir. Bu yaklaşım, satır içi betiklerin kullanımını tamamen yasaklamadan XSS saldırılarını önler. SECURE_CSP_REPORT_ONLY ayarı, mevcut uygulamalarda CSP kurallarının kademeli olarak devreye alınmasını sağlayarak uyumsuzlukların önceden tespit edilmesine olanak tanır.

Soru 4: Template partials (şablon parçaları) hangi avantajları sunar ve hangi senaryolarda özellikle faydalıdır?

Şablon parçaları, ilişkili yeniden kullanılabilir bileşenlerin tek dosyada gruplanmasını sağlayarak şablon organizasyonunu sadeleştirir. partialdef etiketi ile tanımlanan parçalar, include etiketi ve #parça_adı sözdizimi ile diğer şablonlardan dahil edilir. Bu özellik, HTMX gibi kütüphanelerle birlikte kullanıldığında özellikle güçlüdür: AJAX isteklerine yanıt olarak tam sayfa yerine yalnızca ilgili parça döndürülebilir. Dosya sayısı azalır, bağlam paylaşımı kolaylaşır ve şablonlar arasındaki tutarsızlık riski düşer.

Django 5.2'den 6.0'a geçiş uyarıları

Django 6.0'a yükseltme öncesinde kullanımdan kaldırılmış API'lerin incelenmesi ve DeprecationWarning mesajlarının kontrol edilmesi kritik öneme sahiptir. Özellikle DEFAULT_AUTO_FIELD ayarının açıkça tanımlanması, üçüncü taraf paketlerin 6.0 uyumluluğunun doğrulanması ve veritabanı migration'larının temiz bir ortamda test edilmesi gerekmektedir. Django 5.2 LTS Nisan 2028'e kadar güvenlik güncellemesi alacağından, stabil bir üretim ortamı gerektiren projeler geçiş planını dikkatle hazırlamalıdır.

Sonuc

Django 6.0, framework'ün temel yeteneklerini önemli ölçüde genişleten bir sürümdür. Öne çıkan gelişmeler özetle şu şekildedir:

  • Bileşik birincil anahtarlar (CompositePrimaryKey), doğal bileşik anahtarlara sahip veri modellerinde yapay id alanı ihtiyacını ortadan kaldırarak veritabanı tasarımını doğrudan ORM'e yansıtır
  • Yerleşik arka plan görevleri (django.tasks), basit asenkron operasyonlar için harici bağımlılık gerektirmeden e-posta gönderimi, bildirim işleme ve rapor oluşturma gibi işlevleri destekler
  • Şablon parçaları (partialdef), yeniden kullanılabilir bileşenleri tek dosyada gruplama ve HTMX entegrasyonuyla dinamik arayüz geliştirme imkanı sunar
  • CSP ara katman yazılımı, Content Security Policy başlıklarını üçüncü taraf paket gerektirmeden yönetir ve nonce mekanizmasıyla XSS koruması sağlar
  • Ek iyileştirmeler arasında BigAutoField varsayılanı, asenkron sayfalama, shell otomatik içe aktarma ve modernize edilmiş e-posta API'si yer alır
  • Teknik mülakat hazırlığında bileşik anahtarların kısıtlamaları, yerleşik görev sistemi ile Celery karşılaştırması, CSP nonce mekanizması ve şablon parçalarının HTMX ile kullanımı gibi konulara hakim olunması belirleyici bir avantaj sağlar

Pratik yapmaya başla!

Mülakat simülatörleri ve teknik testlerle bilgini test et.

Etiketler

#django
#python
#composite-primary-keys
#background-tasks
#csp

Paylaş

İlgili makaleler