19 Eylül 2008 Cuma

Django Notları - 5 (Veritabanı Kullanımına Genel Bakış)

Artık bir django uygulaması yaratmanın vakti geldi.

python manage.py startapp rehber

Gördüğünüz komut projenizin bulunduğu klasör içerisine "rehber" adlı bir dizin oluşturacak ve dizin yapısını incelerseniz models.py ve views.py dosyalarını görebilirsiniz.

Işık yandı mı?

Kullanıcı sizin sitenize rehber dizini altına girdiğinde (adres çubuğuna www.siteniz.com/rehber yazıp enter tuşuna bastığında) rehber adlı uygulamaya giriş yapmış oluyor. Rehber uygulaması kendi içerisinde sergileme ,veri yönetimi modüllüllerini kısacası rehber uygulamanızda kullanacağınız herşeyi barındırıyor. Böylelikle proje geliştirirken ayrı ayrı geliştirdiğiniz uygulamaları birbirinden bağımsız olarak çalışabiliyorlar. Örneğin daha önce geliştirdiğiniz forum uygulamasını yeni projenize entegre etmek bir klasör kopyalamak ve setting.py içerisine bir satır eklemek kadar kolay oluyor.

Yalnız dikkat etmemiz gereken önemli bir nokta var biz burada uygulama oluştururken keyfi davranmadık. Çünkü Django'da veritabanı modellerinin bir uygulama içerisinde bulundurulması gerekiyor.

Şimdi yarattığımız uygulamayı projeniz içerisine yerleştirmemiz gerekli. settings.py dosyası içeriside INSTALLED_APPS adlı bir tüp (tuple) göreceksiniz. Gördüğünüz gibi projemiz şu anda kullanmayacağımız birkaç uygulama barındırıyor. Bunların başına yorum işareti koyarak (#) iptal edelim ve rehber uygulamamızı tüp içerisinde belirtelim. Yalnız burada dikkat etmemiz gereken birşey var Python da tek elemanlı bir tüp belirtiyorsak elemanımızın yanına bir adet , koymayı unutmamalıyız. Çünkü eğer virgül koymazsak python bunu gruplama işareti olarak algılıyor.

tek_elemanli_tup = ('eleman',)

bizim de INSTALLED_APPS'ımız şı şekilde olacak:

INSTALLED_APPS = (
# 'django.contrib.auth',
# 'django.contrib.contenttypes',
# 'django.contrib.sessions',
# 'django.contrib.sites',
'mysite.rehber',
)


İlk Modelimiz



Şimdi bir uygulama oluşturmuş ve bunu projemiz içine yerleştirmiş bulunmaktayız. Veritabanı ile oynaşmaya başlayabiliriz. mysite/rehber içerisindeki models.py dosyasını düzenlemek üzere açın. Aşağıdaki hale getirin.

from django.db import models

# Create your models here.

class rehber(models.Model):
firstname = models.CharField(max_length = "20")
surname = models.CharField(max_length = "20")
phone = models.CharField(max_length = "14")


İşte bitti ... models.Model sınıfının mirascısı olarak yarattığımız model; atasından veritabanı ile ilgili bütün mekanizmayı miras alıyor. Bu sebepten (yerel veri tabanına senkronize edildikten sonra) kullanılmaya hazır halde.

Veri modellerimizi veri tabanına senkronize etmeden önce herhangi bir soruna oluşmasına karşı onaylatmamız gerek. Bu işlem zorunlu değil ama yinede yapsanız iyi olur.

mysite $ python manage.py validate
0 errors found.


Tamam herşey güzel gözüküyor kazasız belasız modelimizi oluşturmuşuz.. o zaman hadi veritabanımız ile senkronize edelim.

mysite $ python manage.py syncdb
Loading 'initial_data' fixtures...
No fixtures found.


Bu komut size farklı cevaplar verebilir (ben veri tabanı olarak sqlite3 kullanıyorum.) ama error demiyorsa sorun yok demektir. Veritabanımız, modellerimiz oluşturuldu ve senkronize edildi. Şimdi yapabileceğimiz işlemleri uygulamalı olarak ele alalım. Bunun için etkileşimli kabuğu kullanacağız.

mysite $ python manage.py shell

Bu bize bizim projemizdeki ayarlarımızla yüklenmiş bir kabuk açacaktır.

Kayıt Eklemek ve Güncellemek



In [1]: from mysite.rehber.models import rehber

In [2]: people = rehber(firstname='Mirat',surname='bayrak',phone='123 23 23')

In [3]: people.save()


Gördüğünüz ilk satırda projemiz altındaki rehber uygulaması içerisindeki modellerden rehber modelini import ettik. Daha önce söylediğim gibi bu model tek başına veri tabanı işlemleri için gerekli bütün mekanizmayı içeriyor.

2. satırda bir rehber örneği oluşturduk.

3. satırda kaydettik!!

Kayıtları Listelemek



In [4]: print rehber.objects.all()
[]


rehber.nesnelerinin.hepsi() gibi harika bir cümle yapısıyla veri tabanımızdaki bütün kayıtları getirdik (henüz 1 tane var) fakat birşey eksik sanki? print komutu bize bir Python veri sınıfı olarak gösterdi nesnemizi.. neden oldu bu? çünkü modelimiz kendisini nasıl karakter katarı olarak sergileyeceğini bilmiyor (string presentation).

Modele davranış kazandırmak



Şimdi ctrl+d kombinasyonu ile kabuktan çıkın. Tekrar rehber uygulaması içerisindeki models.py dosyasını açın ve onu şu hale getirin.

class rehber(models.Model):
firstname = models.CharField(maxlength=30)
surname = models.CharField(maxlength=30)
phone = models.CharField(maxlength=14)
def __str__(self):
return "name : %s , surname : %s , phone : %s" % (self.firstname,self.surname,self.phone)


Burada ne yaptık? __str__ fonksiyonu tanımlayarak modelimize kendisini nasıl metin olarak sergileyeceğini öğrettik.

Önemli not : Django 1.0 ile birlikte __str__() yerine __unicode__() fonksiyonunun kullanılması öneriliyor.

Şimdi tekrar kabuğa dönüp kayıtlarımızı listeletmeye çalışalım.

In [1]: from mysite.rehber.models import rehber

In [2]: print rehber.objects.all()

[

Veriyi Güncellemek



Eğer yukarıda geçen kaydetme kısmında verdiğimiz kodda people örneğinin içindeki herhangi bir alanı değiştirip tekrar kaydetseydik. Bu yeni bir kayıt olarak geçmeyecek, veritabanındaki aynı kayıt güncellenecekti.

In [1]: from mysite.rehber.models import rehber

In [2]: people = rehber(firstname='Mirat',surname='Çaylak',phone='123 23 23') # örnek oluştur

In [3]: people.save() # kaydet

In [4]: rehber.objects.all() # bütün veri tabanını getir

Out[4]: []

In [5]: people.surname = "kamil" # örnepğin surname alanını değiştir

In [6]: people.save() # tekrar kaydet

In [7]: rehber.objects.all() # yeni kayıt oluşmadı, olan değiştirildi.

Out[7]: []


Filitrelemek



Sadece belli kriterlere sahip veriyi çekmek istediğimizde ,örneğin sadece firstname alanı "Mirat" olan kayıtları getirmek için...

In [9]: rehber.objects.get(firstname='Mirat')
Out[9]:


"Mi" hecesiyle başlayan kayıtları listelemek için :

>> print Entry.objects.filter(firstname__startswith="Mi")

İçinde "rat" hecesi geçen kayıtları aramak için..

>> print Entry.objects.filter(firstname__contains="rat"),

Sıralamak



Genelde veritabanından çektiğimiz veriyi belli bir sıralamaya göre sergilemek isteriz. Örneğin forumlarda her giriş (entry) tarihsel olarak yeniden eskiye doğru sıralanırlar. Biraz önce veritabanından nasıl veri alacağımızı görmüştük sıralama işlemi ise gayet kolay.

isme göre sıralayarak bütün verileri getir :

>>> rehber.objects.order_by("firstname")

kolay değilmi?

hem filitreleme hemde sıralama uygulamak istediğimizde:

>>> rehber.objects.filter(firstname__contains = "rat").order_by("name")

harika... :) eğer order_by("-name") deseydik sıralamayı tersine çevirecekti.

Parça Almak



Örneğin bütün rehberinizi isim,numara şeklinde değil, sadece numaraları almak istiyorsanız.

>>> rehber.objects.all()[0]

şeklinde o tabloya bir listeymiş gibi davranabilirsiniz.

Bittimi? bitmedi... bir dahaki yazımızda görüşmek üzere...

1 yorum: