Skip to main content

Django Model Oluşturma ve Veritabanı Tablolarına Eşleme (ORM) ⚙️

Bu rehberde, Django ORM (Object-Relational Mapping) kullanarak blog uygulamanız için veri modelleri oluşturmayı öğreneceksiniz. Ubuntu 22.04 sanal sunucu örneğiniz üzerinde, Post ve Comment modellerini tanımlayacak, projeye tanıtacak ve bu modelleri veritabanı tablolarına dönüştüreceğiz.


1. Django Uygulamasını Başlatma ve Modelleri Tanımlama

Django projelerinde, modülerliği korumak için bileşenler ayrı uygulamalar içinde tutulur. Bu rehberde blog için ayrı bir Django uygulaması oluşturacağız.

1.1 Uygulama Oluşturma

Öncelikle, Python sanal ortamınızı etkinleştirin ve proje dizinine gidin:

cd ~/my_blog_app/blog
. env/bin/activate

Ardından, yeni bir Django uygulaması oluşturmak için aşağıdaki komutu çalıştırın:


python manage.py startapp rabisu_blog

Bu komut, rabisu_blog adında yeni bir Django uygulaması oluşturur.

1.2 Post ve Comment Modellerini Yazma

Uygulama dizininde yer alan models.py dosyasını düzenleyerek, Post ve Comment modellerini tanımlayacağız. Post modeli blog yazılarını, Comment modeli ise bu yazılara yapılan yorumları temsil edecektir.


nano rabisu_blog/models.py

Bu dosyaya aşağıdaki kodu ekleyin:


from django.db import models
from django.template.defaultfilters import slugify
from django.urls import reverse

class Post(models.Model):
title = models.CharField(max_length=255)
slug = models.SlugField(unique=True, max_length=255)
content = models.TextField()
created_on = models.DateTimeField(auto_now_add=True)
author = models.TextField() # Gerekirse User modeline dönüştürülebilir

def get_absolute_url(self):
return reverse('blog_post_detail', args=[self.slug])

def save(self, *args, **kwargs):
if not self.slug:
self.slug = slugify(self.title)
super(Post, self).save(*args, **kwargs)

class Meta:
ordering = ['created_on']

def __str__(self):
return self.title

class Comment(models.Model):
name = models.CharField(max_length=42)
email = models.EmailField(max_length=75)
website = models.URLField(max_length=200, null=True, blank=True)
content = models.TextField()
post = models.ForeignKey(Post, on_delete=models.CASCADE) # Bire-Çok ilişkisi kurar
created_on = models.DateTimeField(auto_now_add=True)

Açıklamalar:

Post modeline, yazı başlığı, içerik, yazar ve oluşturulma tarihi gibi alanlar ekledik.

Comment modelinde ise, yorumun sahibi, içeriği ve hangi yazıya ait olduğunu belirten bir ForeignKey ilişkisi kurduk.


2. Uygulamayı Projeye Tanıtma ve Göç İşlemleri

Yeni oluşturduğumuz modellerin veritabanında karşılık bulması için projeye tanıtılması gerekir.

2.1 settings.py Dosyasını Güncelleme

Projeye yeni uygulamamızı tanıtmak için, settings.py dosyasındaki INSTALLED_APPS listesine rabisu_blog uygulamasını ekleyelim:


INSTALLED_APPS = [
'rabisu_blog', # Yeni uygulamayı projeye dahil ediyoruz
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
]

2.2 Göç Dosyalarını Oluşturma ve Uygulama

Model değişikliklerini veritabanına uygulamak için göç (migration) komutlarını çalıştırmamız gerekiyor.

öç Dosyalarını Üretme


cd ~/my_blog_app/blog
python manage.py makemigrations

Göçleri Uygulama


python manage.py migrate

Bu komut, Post ve Comment modelleri için gerekli tabloları MySQL veritabanında oluşturur.


3. Veritabanı Şemasını Doğrulama

Göç işlemi tamamlandıktan sonra, veritabanındaki tabloları kontrol edelim.

3.1 MySQL'e Bağlanma


mysql blog_data -u rabisu_user

Veritabanını seçtikten sonra:


USE blog_data;
SHOW TABLES;

3.2 Tablo Yapısını İnceleme

Yeni oluşturduğumuz Comment tablosunun yapısını şu şekilde kontrol edebiliriz:

DESCRIBE rabisu_blog_comment;

Aynı şekilde Post tablosunun yapısını da kontrol edebiliriz:


DESCRIBE rabisu_blog_post;

Sıkça Sorulan Sorular (SSS)

  1. Django ORM kullanmanın avantajı nedir?

ORM (Nesne-İlişkisel Eşleme), SQL sorguları yazmak yerine Python sınıfları ve metotları kullanarak veritabanı işlemlerini yönetmeyi sağlar. Bu, kod tekrarını azaltır ve taşınabilirliği artırır.

  1. makemigrations ve migrate arasındaki fark nedir?

makemigrations, model sınıflarındaki değişiklikleri algılar ve bu değişiklikleri uygulayacak Python/SQL dosyalarını (göç dosyaları) hazırlar. migrate ise bu hazırlanmış göç dosyalarını alıp gerçek veritabanına uygular, yani tabloları oluşturur/günceller.

  1. ForeignKey ne işe yarar?

ForeignKey, iki model arasında Bire-Çok ilişkisi kurar. Örneğin, birçok yorumun tek bir yazıya ait olduğunu belirtir. on_delete=models.CASCADE ayarı, ana kayıt (Yazı) silindiğinde ilişkili tüm alt kayıtların (Yorumlar) da otomatik olarak silinmesini sağlar.

  1. Django'da CharField ve TextField arasındaki temel fark nedir?

CharField, kısa, genellikle tek satırlık metinler (max_length zorunludur) için kullanılırken, TextField sınırsız uzunlukta olabilen, çok satırlı metinler (blog yazısı içeriği gibi) için kullanılır.


Sonuç

Bu rehberde, Django'da Bire-Çok ilişkisini nasıl kuracağınızı, modelleri nasıl oluşturacağınızı ve veritabanı şemalarını nasıl yöneteceğinizi öğrendiniz. Django'nun migration ve model yapılarını kullanarak veritabanınızı verimli bir şekilde yönetebilirsiniz. Bu yöntemleri Rabisu Bulut sanal sunucu örnekleri üzerinde kolayca uygulayabilirsiniz.