Django'da veri çekme işlemleri çoğu zaman `QuerySet` kullanılarak yapılır. Ancak, veritabanından çok fazla veri çekerken veya gereksiz tekrar eden sorgular yaparken performans kaybı yaşanabilir. Bu noktada, `select_related` ve `prefetch_related` kullanımı devreye girer.
select_related: Eğer veritabanınızda ilişkili model verileriyle işlem yapıyorsanız, her ilişkili model için ayrı ayrı sorgu yapmaktan kaçınmak adına `select_related` kullanılabilir. Bu sayede, ilişkili modellerin verileri tek bir sorguda çekilir.
Örnek:
```python
# Bir ürünün kategorisini almak
products = Product.objects.select_related('category').all()
```
Bu kod, her ürün için kategoriyi ayrı ayrı sorgulamak yerine, tek bir sorgu ile tüm ürünlerin kategorisini çekmenizi sağlar.
prefetch_related: Eğer bir modelin birden fazla ilişkili veri seti varsa, `prefetch_related` daha verimli bir çözüm sunar. Bu, ilişkili veri setlerini ayrı sorgularla alır ve sonra verileri Python içinde birleştirir.
Örnek:
```python
# Bir kategoriye ait tüm ürünleri almak
categories = Category.objects.prefetch_related('products').all()
```
Bu, her kategori için ürünleri tek bir sorgu ile getirmenize olanak tanır.
Lazy loading, Django'da sorgu sonuçlarını sadece ihtiyaç duyduğunuzda yüklemenin bir yöntemidir. Eğer gereksiz yere tüm veriyi yüklemeye çalışırsanız, bu veritabanı performansını olumsuz etkiler. Lazy loading, bu sorunun önüne geçmenizi sağlar. Örneğin, sadece bir ürünün detaylarına ihtiyaç duyuyorsanız, tüm kategori verilerini sorgulamak yerine yalnızca ürün bilgilerini alırsınız.
Django şablonları, uygulamanızın görünümünü kullanıcıya sunan önemli bir parçadır. Ancak şablonlar içinde gereksiz veri işlemeleri yapmak, sayfa yükleme sürelerini artırabilir. Django'da şablonları optimize etmek için bazı ipuçları:
1. Değişken Kontrolü ve Filtre Kullanımı: Şablonlarınızda büyük veri kümelerini işlemeden önce, bu verilerin gerçekten gerekli olup olmadığını kontrol edin. Gereksiz veri hesaplamaları yapmaktan kaçının.
2. Veri Önbellekleme: Veritabanı sorgularını ve şablon içeriklerini önbelleğe alarak, her seferinde aynı veriyi çekmektense, hızla erişebileceğiniz şekilde saklayın.
Örnek:
```html
{% load cache %}
{% cache 600 my_data %}
{{ data }}
{% endcache %}
```
Bu örnek, verilerin 10 dakika boyunca önbellekte saklanmasını sağlar ve tekrar eden isteklerde veritabanı sorgusu yapılmaz.
Django'da cache kullanmak, uygulamanızın hızını artırmanın önemli yollarından biridir. Cache, şablonlar veya veritabanı sorguları gibi yoğun işlem gerektiren verilerin saklanmasına olanak tanır. Bu sayede, her kullanıcı için tekrar tekrar veri işlemek yerine, veriler hızlıca önbellekten çekilir.
Örnek:
```python
from django.core.cache import cache
# Veritabanı sorgusunun sonucu önbelleğe alınır
def get_product_details(product_id):
product = cache.get(f'product_{product_id}')
if not product:
product = Product.objects.get(id=product_id)
cache.set(f'product_{product_id}', product, timeout=3600)
return product
```
Bu kod, her seferinde veritabanı sorgusu yapmak yerine, verileri cache'den alır ve veritabanına yalnızca önbellekte veri yoksa başvurur.
Performans iyileştirmelerini izlemek, neyin işe yaradığını ve neyin daha fazla iyileştirilmesi gerektiğini anlamanın en önemli yollarından biridir. Django'da performans izlemek için Django Debug Toolbar gibi araçları kullanabilirsiniz. Bu araç, her bir sorgunun ne kadar sürdüğünü, hangi veritabanı işlemlerinin yapıldığını ve şablonların ne kadar zaman harcadığını görmenizi sağlar.
Ayrıca, New Relic veya Sentry gibi daha gelişmiş araçlar kullanarak, uygulamanızın gerçek zamanlı performansını izleyebilirsiniz. Bu araçlar, Django uygulamanızda ortaya çıkan sorunları hızlıca tespit etmenize ve çözmenize yardımcı olur.