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 Hayat | Django Model |
|---|---|
| Defter | Veritabanı |
| Tablo | Model |
| Satır | Kayıt (Record) |
| Sütun | Alan (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 |
|---|---|
| CharField | Kısa metin |
| TextField | Uzun metin |
| IntegerField | Tam sayı |
| FloatField | Ondalık sayı |
| BooleanField | True / False |
| DateField | Tarih |
| DateTimeField | Tarih + Saat |
| EmailField | |
| ImageField | Resim |
| FileField | Dosya |
🎯 Ö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:
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.). Mutlakamax_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_digitsvedecimal_placeszorunludur.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) veyaauto_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:
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.
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.
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.
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.
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:
Değişiklikleri kaydetmek için: Python kodunuzu okuyup veritabanı için bir taslak (migration dosyası) oluşturur.
Bash:python manage.py makemigrationsDeğ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.pydosyasında ne zaman bir şey eklerseniz, silerseniz veya değiştirirseniz mutlakamakemigrationsvemigrateiş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
Yorum Gönder