30 Aralık 2013 Pazartesi

Django'da Hesaplama İşlemleri ve Q Nesnesi ile Karmşık Sorgulamalar

Merhaba Arkadaşlar,

Bu gün sizlere Django'nun işlerimizi kolaylaştırmak için bize sunduğu hesaplma işlemlerini ve Q nesnesinin ne işe yaradığını anlatacağım. Bu gün anlatacağım konular için hayali bir Kitap veritabanı olduğunu var sayalım. Hatta görünümümüz de aşağıdaki gibi olsun ki aklımız da soru kalmasın :

class Kitap(models.Model):
    turu=models.ForeignKey(Tur,verbose_name='Tür')
    adi = models.CharField(max_length=100,verbose_name='Adı')
    yazarlari = models.ManyToManyField(Yazar, verbose_name= 'Yazarları',blank=true)
    yayinevi = models.ForeignKey(Yayinevi, verbose_name='Yayinevi')
    sayfa_sayisi = models.IntegerField(verbose_name= 'Sayfa Sayısı', blank = true)
    basim_tarihi = models.DateField(verbose_name = 'Basım Tarihi', blank = true)
    fiyati = models.FloatField (verbose_name = 'Fiyatı', blank = true)
    
class Meta:
    ordering = ['adi']
    
def __unicode__(self):
    return u'%s' % (self.adi)

Şimdi sizlere hesaplama işlevlerinin bazılarını tabloya ve örnek kullanımlarını tabloda göstereyim:

İşlev AnlamıÖrnek
countSayma işlemini yapar.tür alanı 5 olan kitapların sayısını bulalım.
>>>Kitap.objects.filter(turu=5).count()
AvgOrtalamayı bulur yazarlar alanı 1 olan kitapların ortalama sayfa sayısını bulalım:
>>> from django.db.models import Avg
>>>Kitap.objects.filter(yazarlari=1).aggregate(Avg('sayfa_sayisi'))
MaxEn büyüğünü bulur En pahalı kitabın fiyatını bulalım:
>>> from django.db.models import Max
>>>Kitap.objects.aggregate(Max('fiyati'))
MinEn küçüğünü bulur Sayfa sayısı en az olan kitabın sayfa sayısını bulalım:
>>> from django.db.models import Min
>>>Kitap.objects.aggregate(Min('sayfa_sayisi'))
SumToplamını bulur yazar alanı 1 olan kitapların toplam sayfa sayısını bulalım:
>>> from django.db.models import Sum
>>>Kitap.objects.filter(yazarlari=1).aggregate(Sum('sayfa_sayisi'))



Şimdi de Django veritabanı sorgulamalarında kullanabileceğimiz alan irdelemelerini ve anlamlarını tablolamak istiyorum:

İrdeleme Analmı
exactSorgulamada tam eşleşmeyi arar.
iexactDuyarsız eşleme
containsİçerisinde belirlenen alt kelime grubunun bulunduğu eşlemeleri yapar.
icontainsİçerisinde belirlenen alt kelime grubunun bulunduğu eşlemeleri duyarsız yapar.
inBir listede bulunup bulunmadığına bakar.
gtDaha büyük (>)
gteDaha büyük ya da eşit
ltDaha küçük (<)
lteDaha küçük ya da eşit
statrwith'ile başlayan'
istatrwithduayrsız 'ile başlayan'
enswith'ile biten'
ienswithduyarsız 'ile biten'
rangebelirli aralıkta bulunan
yearYıl araması yapar
montAY araması yapar
dayGün araması yapar

Q Nesnesi İle Karmaşık Sorgulama

Sorgularımızda filter() işlevine verdiğimiz parametreler AND ile kullanılır. Örneğin sayfa sayısı 350'den az, fiyatı 18 tl'den fazla olan kitapları bulmak için şöyle bir sorguya ihtiyacımız olacaktır.

Kitap.objects.filter(sayfa_sayisi__lt= 350, fiyati__gt=18)

Bu sorgunun ham SQL sorgusu da şöyledir:

SELECT *
FROM kitap_kitap 
WHERE sayfa_sayisi <350 AND fiyati > 18 

Eğer sorguları OR  ile birleştirmek istiyorsak Q nesnesini kullanmamız gerekir.Diyelim ki sayfa sayısı 350'den az veya fiyatı 20 TL'den fazla olan kitapları arayalım. Eğer SQL kullansaydık sorgumuz söyle olacaktı 

SELECT *
FROM kitap_kitap 
WHERE sayfa_sayisi <350 OR fiyati > 20 

Bu sorguyu Django nesnelerini kullanarak şöyle yaparız:

>>> from django.db.models import Q 
>>> sorgu = Q(sayfa_sayisi__lt=350) | Q(fiyati__gt=20)
>>> Kitap.objects.filter(sorgu)


Ham SQL Sorgusu İle Sorgulama Yapma 

Bazen model sorgulamaları yetersiz kaldığında ham SQL sorgularına da ihtiyaç duyabiliriz. Django ham SQL sorgusu yapmayı engellemez. Örnek bir ham SQL sorgusu :


>>> for kitap in Kitap.objects.raw('SELECT * FROM kitap_kitap')
...     print kitap


Bu kullanım Kitap.objects.all() sonucu ile aynıdır. 


Referanslar :
  1. https://docs.djangoproject.com/en/dev/ref/models/querysets/
  2. BAŞER, Mustafa (2013). Django
  3. http://www.slideshare.net/Counsyl/efficient-djangoquery-setuse

Hiç yorum yok:

Yorum Gönder