Django’da Admin panelinde modelleri Türkçe çoğul yapma

Django’da admin panelinde modeller verdiğiniz ad ne olursa olsun çoğul yapılırken sonuna ‘s’ takısı alır (örneğin Personels). Oysa ki biz Personel modelini admin panelinde Personeller olarak görmek isteyebiliriz.

Bu durumda Personel modeline aşağıdaki sınıfı eklemeniz yeterli olacaktır:

class Personel(models.Model):
    .......
    class Meta:
        verbose_name_plural = "Personeller"

Python ile listeleri sıralamak

Python’da listeleri sıralamak için iki yol izlenebilir. Birincisi sort() metodu. Bu metod üzerinde uygulanan listeyi sıralar. Ancak none döndürdüğüne dikkat edilmelidir.

liste = [6,3,9]
liste.sort()
liste
[3, 6, 9]

Yani aşağıdaki şekilde bir atama yapamazsınız.

sirali_liste = liste.sort()
Bunun yerine sorted fonksiyonunu kullanabilirsiniz.

sirali_liste = sorted(liste)
Sorted fonksiyonu ayrıca argümanlarla özelleştirilebilir.

liste = ["google", "android", "java"]
sorted(liste, reverse=True)
['java', 'google', 'android']

Bence sorted fonksiyonunun en güzel tarafı, listeleri sıralamak için custom fonksiyon yazılabilmesidir.

sorted(liste, key=len)
['java', 'google', 'android']

Len gibi hazır bir fonksiyon kullanılabilir veya yazılan bir fonksiyon kullanılabilir.

def Fonk(a):
    return a(-1)
sorted(liste, key=Fonk) ['java', 'android', 'google']

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.

Google Python Class string2.py Çözümü

Google’ın Python alıştırmaları veren sınıfında ödevlerden biri olan string2.py’nin front_back alıştırmasını aşağıdaki şekilde çözdüm. Bu alıştırmada verilen iki string’in uzunluklarına göre bölünmesi ve tek bir string haline getirilmesi isteniyor. Eğer string uzunluğu çift ise ortadan ikiye bölünecek, tekse yine ortadan ikiye bölünecek ancak artan (yani string’in ortasındaki) harf baştaki parçaya eklenecek. Bundan sonra istenen ise ilk string’i a1 ve a2 olarak, ikincisini de b1 ve b2 olarak bölmüşsek hepsinin a1+b1+a2+b2 şeklinde tek string halinde döndürülmesi.

def front_back(a, b):
a1 = a[:len(a)/2+len(a)%2]
a2 = a[len(a)/2+len(a)%2:]
b1 = b[:len(b)/2+len(b)%2]
b2 = b[len(b)/2+len(b)%2:]
print a1,a2,b1,b2
return a1+b1+a2+b2

Python’da liste kopyalama

Python’da listeleri aşağıdaki eşitlikle kopyalamaya çalıştığınızda liste içerisindeki değerler kopyalanmaz; listenin referans değeri kopyalanır. Bu durumda bir listede yapılan değişiklikler diğerinde de geçerli olur.

liste1=["deger1","deger2","deger3"]
liste2=liste1
liste2.append("deger4")
print liste1,liste2
['deger1', 'deger2', 'deger3', 'deger4'] ['deger1', 'deger2', 'deger3', 'deger4']

Bunun yerine değerleri kopyalamak için aşağıdakiler kullanılabilir:

liste1=["deger1","deger2","deger3"]
liste2=list(liste1)
liste2.append("deger4")
print liste1,liste2
['deger1', 'deger2', 'deger3'] ['deger1', 'deger2', 'deger3', 'deger4']

Veya:
liste1=["deger1","deger2","deger3"]
liste2=liste1[:]
liste2.append("deger4")
print liste1,liste2
['deger1', 'deger2', 'deger3'] ['deger1', 'deger2', 'deger3', 'deger4']

Son iki örnekte verilen kodlarda sadece değerler kopyalanır; bir listede yapılan değişiklik diğerini etkilemez.