26 Aralık 2013 Perşembe

Django'da Veritabanı-2

Merhaba Arkadaşlar,

Geçen hafta Django'da veri tabanınına giriş yapmıştık. Veri tabanına verinin nasıl girildiğini ve verinin nasıl alındığını anlatmıştım. Bu hafta ise sorgulama, güncelleme, sıralama ve silme gibi veritabanı işlemlerini anlatmak istiyorum.

VERİ SORGULAMA 

Geçen hafta bir tablodaki tüm veriyi alabilmek için objects.all() özelliğinin nasıl kullanıldığını gördük. Peki bir tablodaki bütün veriden ziyade sadece belli özelliklere sahip olan veriyi almak için ne yapmalıyız? Bunun için yani verileri filtrelemek için ise objects.filter() özelliğini kullanırız. Örneğin geçen haftaki örneğimizden adı Ali olan öğretim elemanlarını filtrelemek istersek :

>>> ogretimelemanlari = OgretimElemani.objects.filter(adi='Ali')
>>> ogretimelemanlari
[<OgretimElemani:Taş, Ali>]

Burada tam eşleme yapılmıştır ve büyük-küçük harf duyarlılığı vardır. Eğer birden fazla özelliği filtrelemek istiyorsak objects.filter( filtre1, filtre2,...) şeklinde kullanabiliriz.

Soyadında 'k' harfi bulunduran öğretim elemanlarını filtrelemek istersek:

>>> ogretimelemanlari = OgretimElemani.objects.filter(soyadi__contains='k')
>>> ogretimelemanlari
[<OgretimElemani:Kaya, Hakan>,<OgretimElemani:Keser, Mustafa>,<OgretimElemani:Kaya, Mustafa>]

Django'nun bir diğer kullanışlı özelliği de filtrelerin birlikte kullanılmasıdır. Örneğin adında adında 'a' harfi olup da soyadında 'a' harfi olmayanları filtrelemek istersek :

>>> ogretimelemanlari = OgretimElemani.objects.filter(adi__contains='a').exclude(soyadi__contains='a')
>>> ogretimelemanlari
[<OgretimElemani:Keser, Mustafa>]

Bir modeldeki alanları ve içeriklerini values özelliği ile alabiliriz. Örneğin bir derse ve bir öğrenciye ait bilgileri ekrana bastıralım :

>>> alan1 = Ders.objects.values()[1]
>>> for a in alan1:
...     print a ,':', alan1[a]
...
ogretim_elemani_id : 3
kodu : BIM333
id : 3
tanimi :
adi : Network Programlama

>>> alan2 = Ogrenci.objects.values()[0]
>>> for b in alan2:
...     print b ,':', alan2[b]
...
soyadi : Keskin
id : 1
numarasi : 1
adi : Mehmet

Peki ya yapacağımız sorguda dilimleme yapmak istersek ne yapmalıyız? Yani yapacağımız sorguda belli sayıda satır almak istiyorsak ne yapmalıyız? Örneğin veritabanımızdaki ilk 20 öğrenciyi alalım:

>>> ilk20ogrenci = Ogrenci.objects.all()[0:20]

Burada yapılan işlem, önce tüm öğrencileri sorgulayıp daha sonra ilk 20 öğrenciyi almak değil; sorgulama yaparken ilk 20 satırı almaktır. Böylece performansı arttırmış, bellek kullanımını azaltmış oluruz. Aynı sonucu aşağıdaki gibi de elde edebiliriz ama bu sırada performans düşer, bellek kullanımı da artmış olur. Bu yüzden aşağıdaki kullanımdan kaçınmalıyız :

>>> ogrenciler = Ogrenci.objects.all()
>>> ilk20ogrenci = ogrenciler[0:20]

VERİ GÜNCELLEME

Django'da veri güncelleme de oldukça basittir. Önce nesneyi alıp daha sonra istediğimiz özelliğini değiştiririz. Örneğin OgretimElemani tablomuzdan adı Mustafa soyadı Kaya olan öğretim elemanının telefon numarasını göncelleyelim :

>>> ogrelm = OgretimElemani.objects.filter(adi='Mustafa',soyadi='Kaya')[0]
>>> ogrelm.telefonu='123456789'
>>> ogrelm.save()


VERİ SIRALAMA

Django'da da diğer dillerde olduğu gibi herhangi bir sıralama yapılmamışsa sorgular rastgele gelir.Yani SQLite verinin eklenme sırasına göre sıralar. Django'da sıralamalar objects.order_by() özelliği ile yapılmaktadır. Veritabanımızdaki öğretim elemanlarını isimlerine göre sıralayalım :


>>> ogretimelemanlari = OgretimElemani.objects.order_by('adi')

>>> ogretimelemanlari
[<OgretimElemani: Taş, Ali>, <OgretimElemani: Kaya, Hakan>, <OgretimElemani: Ke
ser, Mustafa>, <OgretimElemani: Kaya, Mustafa>]

Eğer sıralamayı tersten yapmak istiyorsak da sıralama alanının önüne eksi(-) işareti koyarız :

>>> ogretimelemanlari = OgretimElemani.objects.order_by('-adi')

>>> ogretimelemanlari
[<OgretimElemani: Keser, Mustafa>, <OgretimElemani: Kaya, Mustafa>, <OgretimElem
ani: Kaya, Hakan>, <OgretimElemani: Taş, Ali>]

Çoğu zaman sorgulamaların ön tanımlı bir alana göre sıralanmasını isteyebiliriz. Örneğin Öğretim elemanlarını, sıralama ölçütü vermediğimiz durumlarda soyadına göre listelemek isteyebiliriz. Bunu yapmak için models.py dosyamızı aşağıdaki gibi tanımlamamız yeterli olacaktır. Hatırlatmakta fayda var diye tekrarlamak istiyorum. .py uzantılı dosyalarımızda yaptığımız herhangi bir değişikliği Django kabuğunda da görmek istiyorsak kabuğu tekrardan başlatmamız gerekir.

class OgretimElemani(models.Model):
    adi = models.CharField(max_length =50)
    soyadi = models.CharField(max_length =50)
    telefonu = models.CharField(max_length =10,blank=True)
    e_posta_adresi = models.EmailField(blank = True)

    def __unicode__(self):
        return u'%s, %s' %(self.soyadi,self.adi)
    
    class Meta:
        ordering =['soyadi']

Şimdi de Django kabuğunu yeniden başlatıp öğreitm elemanlarını listeleyelim:

>>> from yonetim.models import *

>>> OgretimElemani.objects.all()
[<OgretimElemani: Kaya, Hakan>, <OgretimElemani: Kaya, Mustafa>, <OgretimElemani
: Keser, Mustafa>, <OgretimElemani: Taş, Ali>]

>>>

VERİ SİLME

Nesneleri silmek için delete() özeliğini kullanırız. Ali Taş öğretim görevlisini silelim :

>>> ogrelmsil = OgretimElemani.objects.get(soyadi ='Taş', adi='Ali')
>>> ogrelmsil.delete()
 
>>> OgretimElemani.objects.all()
[<OgretimElemani: Kaya, Hakan>, <OgretimElemani: Kaya, Mustafa>, <OgretimElemani
: Keser, Mustafa>]
>>>

Burada öğretim elemanını almak için objects.get() özelliğini kullandık. Ama bu özelliği kullanırken dikkatli olmalıyız. Çünkü veri tabanımızda olmayan bir veriyi almak istersek hata yükselir. Django tabloları oluştururken her satıra tekil bir ID alanı oluşturur. O halde silme işlemi yaparken bı ID numarasını kullanmak daha mantıklı olacaktır. ID numarasına nesnenin id  yada pk özelliğinden arişebiliriz. Şimdi bir öğretim elemanı ekleyelim.

>>> ogrelm = OgretimElemani(adi='Fatih', soyadi ='Çelik')
>>> ogrelm.pk

Kaydedilmeden önce ID numarası yoktur. Şimdi kaydedip ID numarasını öğrenip ona göre silelim :

>>> ogrelm.save()
>>> ogrelm.pk
6
>>> ogrelm.id
6
>>> OgretimElemani.objects.all()
[<OgretimElemani: Kaya, Hakan>, <OgretimElemani: Kaya, Mustafa>, <OgretimElemani
: Keser, Mustafa>, <OgretimElemani: Çelik, Fatih>]
>>> OgretimElemani.objects.filter(id=6).delete()
>>> OgretimElemani.objects.all()
[<OgretimElemani: Kaya, Hakan>, <OgretimElemani: Kaya, Mustafa>, <OgretimElemani
: Keser, Mustafa>]

>>>

Daha ayrıntılı sorgulama seçeneklerine ve model alan tiplerine  buradan ulaşabilirsiniz.

Referanslar :
  1. https://docs.djangoproject.com/en/dev/
  2. BAŞER, Mustafa (2013). Django

Hiç yorum yok:

Yorum Gönder