Django Model Nedir?

 Django'nun kalbi diyebileceğimiz Modeller (Models), veritabanı işlemlerini karmaşık SQL sorguları yazmadan Python kodlarıyla yönetmemizi sağlayan muazzam bir yapıdır. Bu yapıya ORM (Object-Relational Mapping) adı verilir.


Django'da bir model, veritabanınızdaki tek bir tabloyu temsil eden bir Python sınıfıdır (class). Sınıfın içindeki her bir özellik (attribute) ise veritabanı tablosundaki bir sütuna (field) karşılık gelir. Django, bu modelleri okuyarak sizin için arka planda gerekli veritabanı tablolarını oluşturur ve yönetir.

Django Model Nedir?

📌 1️⃣ Model Nedir?

Django’da Model, veritabanındaki tabloları temsil eden Python sınıflarıdır.

Yani:

Gerçek HayatDjango Model
DefterVeritabanı
TabloModel
SatırKayıt (Record)
SütunAlan (Field)

Model sayesinde:

  • Veritabanı oluşturabiliriz

  • Tablo oluşturabiliriz

  • Veri ekleyebiliriz

  • Veri silebiliriz

  • Veri güncelleyebiliriz


📌 2️⃣ Django ORM Nedir?

Django, veritabanı işlemlerini SQL yazmadan yapmamızı sağlayan bir sistem kullanır:

👉 ORM (Object Relational Mapping)

Örneğin SQL’de:

SELECT * FROM student;

Django ORM’de:

Student.objects.all()

SQL bilmeden veritabanı yönetebilirsin 🎯


🏗 3️⃣ Model Nasıl Oluşturulur?

Adım 1: Uygulama Oluştur

python manage.py startapp okul

Adım 2: settings.py içine ekle

INSTALLED_APPS = [
    ...
    'okul',
]

📌 Adım 3: models.py Dosyası

okul/models.py

from django.db import models

class Ogrenci(models.Model):
    ad = models.CharField(max_length=50)
    soyad = models.CharField(max_length=50)
    yas = models.IntegerField()
    aktif = models.BooleanField(default=True)

    def __str__(self):
        return f"{self.ad} {self.soyad}"

🧾 4️⃣ Field (Alan) Türleri

Django’da en çok kullanılan alan türleri:

Alan TürüAçıklama
CharFieldKısa metin
TextFieldUzun metin
IntegerFieldTam sayı
FloatFieldOndalık sayı
BooleanFieldTrue / False
DateFieldTarih
DateTimeFieldTarih + Saat
EmailFieldEmail
ImageFieldResim
FileFieldDosya

🎯 Örnek: Blog Modeli

class Blog(models.Model):
    baslik = models.CharField(max_length=200)
    icerik = models.TextField()
    yayin_tarihi = models.DateTimeField(auto_now_add=True)
    aktif = models.BooleanField(default=True)

🔄 5️⃣ Migration (Veritabanına İşleme)

Model yazdıktan sonra şu komutları çalıştır:

python manage.py makemigrations
python manage.py migrate

Bu komutlar:

  • Veritabanında tablo oluşturur

  • Modeli SQL’e çevirir

  • Tabloyu fiziksel olarak oluşturur


🧪 6️⃣ Shell Üzerinden Veri Ekleme

python manage.py shell
from okul.models import Ogrenci

Ogrenci.objects.create(ad="Ahmet", soyad="Yılmaz", yas=16)

Tüm kayıtları görmek için:

Ogrenci.objects.all()

🔎 7️⃣ Veri Sorgulama

Tüm kayıtlar

Ogrenci.objects.all()

Filtreleme

Ogrenci.objects.filter(yas=16)

Tek kayıt alma

Ogrenci.objects.get(id=1)

🗑 8️⃣ Veri Silme

ogrenci = Ogrenci.objects.get(id=1)
ogrenci.delete()

✏ 9️⃣ Veri Güncelleme

ogrenci = Ogrenci.objects.get(id=1)
ogrenci.yas = 17
ogrenci.save()

🔗 10️⃣ Model İlişkileri

📌 ForeignKey (Bire Çok)

class Sinif(models.Model):
    ad = models.CharField(max_length=20)

class Ogrenci(models.Model):
    ad = models.CharField(max_length=50)
    sinif = models.ForeignKey(Sinif, on_delete=models.CASCADE)

Bir sınıfta birçok öğrenci olabilir.


📌 ManyToManyField

class Ders(models.Model):
    ad = models.CharField(max_length=50)

class Ogrenci(models.Model):
    ad = models.CharField(max_length=50)
    dersler = models.ManyToManyField(Ders)

Bir öğrenci birçok ders alabilir.


📌 OneToOneField

class Profil(models.Model):
    ogrenci = models.OneToOneField(Ogrenci, on_delete=models.CASCADE)
    adres = models.CharField(max_length=200)

Bir öğrenciye sadece bir profil.


11️⃣ Model Meta Kullanımı

class Ogrenci(models.Model):
    ad = models.CharField(max_length=50)

    class Meta:
        ordering = ['ad']
        verbose_name = "Öğrenci"
        verbose_name_plural = "Öğrenciler"

12️⃣ Admin Paneline Model Ekleme

admin.py

from django.contrib import admin
from .models import Ogrenci

admin.site.register(Ogrenci)

Admin paneline giriş:

/admin

📊 Django Model Çalışma Mantığı Diyagramı

Model (Python Class)
        ↓
makemigrations
        ↓
migrate
        ↓
Veritabanı Tablosu
        ↓
ORM
        ↓
CRUD İşlemleri

🎓 11. Sınıf İçin Örnek Proje Fikri

📚 Öğrenci Not Takip Sistemi

Modeller:

  • Ogrenci

  • Ders

  • Not

İlişkiler:

  • Ogrenci → Ders (ManyToMany)

  • Not → Ogrenci (ForeignKey)


🚀 Profesyonel Seviye İpuçları

✔ null=True → Veritabanında boş bırakılabilir
✔ blank=True → Formda boş bırakılabilir
✔ unique=True → Tekrarsız alan
✔ choices= → Seçmeli alan
✔ default= → Varsayılan değer


🎯 Özet

Django Model:

  • Veritabanı tablosudur

  • Python sınıfıdır

  • ORM ile SQL yazmadan işlem yapar

  • Migration ile tablo oluşturur

  • İlişkisel yapı destekler


Yeni bir Django uygulaması (app) oluşturduğunuzda, models.py adında bir dosya ile karşılaşırsınız. Bütün modellerimizi buraya yazarız. Örnek olarak basit bir "Yazar" (Author) modeli oluşturalım:

Python:
from django.db import models

class Author(models.Model):
    first_name = models.CharField(max_length=50)
    last_name = models.CharField(max_length=50)
    email = models.EmailField(unique=True)

    def __str__(self):
        return f"{self.first_name} {self.last_name}"
  • models.Model: Her Django modeli bu temel sınıftan miras almalıdır.

  • __str__ metodu: Bu metot, objenin yönetici panelinde (admin panel) veya terminalde nasıl görüneceğini belirler. Bunu yazmazsanız objeleriniz "Author object (1)" gibi anlamsız isimlerle görünür.


2. Sık Kullanılan Alan Tipleri (Field Types)

Django, veritabanındaki her veri tipi için bir alan (field) sunar:

  • CharField: Kısa metinler içindir (İsim, başlık vb.). Mutlaka max_length (maksimum uzunluk) parametresi gerektirir.

  • TextField: Uzun metinler içindir (Blog yazısı içeriği, yorum vb.).

  • IntegerField: Tam sayılar içindir.

  • DecimalField: Küsuratlı sayılar içindir (Fiyat vb.). max_digits ve decimal_places zorunludur.

  • BooleanField: Sadece Doğru/Yanlış (True/False) değerleri alır.

  • DateTimeField / DateField: Tarih ve saat tutmak içindir. auto_now_add=True (nesne oluşturulduğunda o anın tarihini ekler) veya auto_now=True (nesne her güncellendiğinde tarihi yeniler) parametreleriyle çok sık kullanılır.


3. Alan Seçenekleri (Field Options)

Alanları özelleştirmek için bazı ekstra parametreler kullanabiliriz:

  • null=True: Veritabanı seviyesinde bu alanın boş (NULL) kalmasına izin verir.

  • blank=True: Form doğrulama (validation) seviyesinde bu alanın boş bırakılmasına izin verir.

  • default="...": Alana varsayılan bir değer atar.

  • unique=True: Bu alandaki verinin veritabanında benzersiz olmasını zorunlu kılar (örneğin e-posta adresleri veya T.C. Kimlik numaraları için).

  • choices: Bir alanın sadece sizin belirlediğiniz seçeneklerden birini almasını sağlar (Açılır liste/Dropdown oluşturur).

Choices Örneği:

Python:
class Task(models.Model):
    STATUS_CHOICES = [
        ('P', 'Pending'),
        ('I', 'In Progress'),
        ('C', 'Completed'),
    ]
    title = models.CharField(max_length=100)
    status = models.CharField(max_length=1, choices=STATUS_CHOICES, default='P')

4. Modeller Arası İlişkiler (Relationships)

İlişkisel veritabanlarının en güçlü yanı tabloları birbirine bağlayabilmektir. Django'da üç ana ilişki tipi vardır:

A. Bire-Çok İlişki (One-to-Many / ForeignKey)

Bir yazarın birden fazla kitabı olabilir, ama bir kitabın (genellikle) tek bir ana yazarı vardır.

Python:
class Book(models.Model):
    title = models.CharField(max_length=200)
    author = models.ForeignKey(Author, on_delete=models.CASCADE)
  • on_delete=models.CASCADE: Eğer yazar silinirse, o yazarın tüm kitaplarının da silinmesini sağlar.

B. Çoka-Çok İlişki (Many-to-Many)

Bir kitap birden fazla kategoriye ait olabilir (Aksiyon, Bilim Kurgu vb.) ve bir kategoride birden fazla kitap olabilir.

Python:
class Category(models.Model):
    name = models.CharField(max_length=50)

class Book(models.Model):
    # ... diğer alanlar ...
    categories = models.ManyToManyField(Category)

C. Bire-Bir İlişki (One-to-One)

Bir kişinin sadece bir profili olabilir ve o profil sadece o kişiye ait olabilir.

Python:
from django.contrib.auth.models import User

class UserProfile(models.Model):
    user = models.OneToOneField(User, on_delete=models.CASCADE)
    bio = models.TextField(blank=True)

5. Meta Sınıfı (Class Meta)

Modelin kendisine ait, alanlar dışındaki ayarlarını yapılandırmak için class Meta kullanılır.

Python:
class Post(models.Model):
    title = models.CharField(max_length=200)
    created_at = models.DateTimeField(auto_now_add=True)

    class Meta:
        ordering = ['-created_at'] # Kayıtları varsayılan olarak en yeniden en eskiye sıralar (-)
        verbose_name = "Blog Yazısı" # Admin panelinde görünecek tekil isim
        verbose_name_plural = "Blog Yazıları" # Admin panelinde görünecek çoğul isim

6. Veritabanını Güncellemek (Migrations)

Modelinizi yazdınız veya değiştirdiniz. Peki veritabanı bunu nasıl bilecek? İşte burada migration komutları devreye girer. Terminalinizde şu komutları sırasıyla çalıştırmalısınız:

  1. Değişiklikleri kaydetmek için: Python kodunuzu okuyup veritabanı için bir taslak (migration dosyası) oluşturur.

    Bash:
    python manage.py makemigrations
    
  2. Değişiklikleri uygulamak için: Oluşturulan bu taslağı SQL komutlarına çevirerek veritabanında çalıştırır.

    Bash:
    python manage.py migrate
    

Önemli Kural: models.py dosyasında ne zaman bir şey eklerseniz, silerseniz veya değiştirirseniz mutlaka makemigrations ve migrate işlemlerini yapmalısınız.


7. Temel ORM İşlemleri (QuerySets)

Modellerimizi oluşturduktan sonra onlarla Python üzerinden etkileşime geçebiliriz (Bu işlemleri test etmek için terminalde python manage.py shell yazabilirsiniz).

  • Veri Ekleme (Create):

    Author.objects.create(first_name="Ahmet", last_name="Yılmaz", email="ahmet@example.com")

  • Tüm Verileri Çekme (Read):

    Author.objects.all()

  • Belirli Bir Veriyi Çekme (Get): (Tek bir sonuç döneceğinden emin olduğunuzda kullanılır)

    Author.objects.get(id=1)

  • Filtreleme (Filter):

    Author.objects.filter(first_name="Ahmet")

  • Veri Güncelleme (Update):

    Python:
    yazar = Author.objects.get(id=1)
    yazar.first_name = "Mehmet"
    yazar.save()
    
  • Veri Silme (Delete):

    Python:
    yazar = Author.objects.get(id=1)
    yazar.delete()
    

Modeller, Django'nun en geniş konularından biridir ancak bu rehber, projelerinizi inşa etmeye başlamanız için ihtiyacınız olan temel temelleri sağlamaktadır.



Yorumlar

Bu blogdaki popüler yayınlar

Pardus Üzerine Django Kurulumu

Python ile Web Geliştirme: Django App Oluşturma