Django’da QuerySet’ler 2 – Filtreleme

Queryset’lerde alınan veri üzerinde filtreleme işlemi aşağıdaki örnekte olduğu gibi yapılabilir.

kisiler = Kisi.objects.all()
kisiler.filter(isim='Ahmet')


Zincirleme filtre de aşağıdaki gibidir.

kisiler = kisiler.filter(yas=20)
kisiler = kisiler.filter(isim__startswith='A')


Dikkat edilmesi gereken nokta bu query’ler çalıştırıldığında veritabanı ile herhangi bir bağlantı kurulmamasıdır (şu ana kadar sadece veriyi çekecek olan query’i oluşturduğumuzu düşünebilirsiniz). Bağlantı queryset’ler içerisindeki bilgiye ulaşılmaya çalışıldığında kurulur.

kisiler = Kisi.objects.filter(isim__startswith='A')
kisiler = kisiler.filter(soyad__contains='E')
for kisi in kisiler:
print kisi.isim


Yukarıdaki kod çalıştırıldığında belirtilen filtreler ile getirilen sonuçları ekrana yazar. Bu sırada veritabanı ile sadece bir kere bağlantı kurulur.

Django’da QuerySet’ler 1

Django’da QuerySetler

Django’da queryset’ler çağırıldığında cache’de tutulurlar. Böylece çağırılan queryset tekrar kullanılarak database üzerindeki yük azaltılmış olur.

Aşağıdaki query’ler çalıştırıldıklarında veritabanı ile iki kere bağlantı kurarak toplamda iki ayrı sorgu çalıştırır.

q = kisi.isim for kisi in Kisi.objects.all()
q = kisi.yas for kisi in Kisi.objects.all()


Bunun yerine daha az kaynak tüketen aşağıdaki yol izlenebilir.

kisiler = Kisi.objects.all()
kisi.isim for kisi in kisiler
kisi.yas for kisi in kisiler

Bu şekilde veritabanı ile sadece bir defa bağlantı kurularak queryset cache’e alınır.