Django, güvenli ve bakımı kolay web sitelerinin ve web uygulamalarının hızlı bir şekilde geliştirilmesi için tanınmış bir web çerçevesidir. Python kullanılarak oluşturulan Django, web geliştirmeyi basitleştirerek her seferinde tekerleği yeniden icat etmek zorunda kalmadan uygulamalar yazmaya daha fazla zaman ve odaklanma sağlar. Django, sağlam resmi belgelere, harika topluluk desteğine ve çok sayıda ücretsiz ve ücretli desteğe sahip ücretsiz ve açık kaynaklı bir projedir.
Bu kılavuzda, Django modelleri oluşturmaya derinlemesine dalacağız. Django'da bir model verileriniz hakkındaki temel bilgi kaynağıdır. Modeller, saklanacak verilerin alanlarını ve davranışlarını tanımlar. Django, ORM (Object Relational Mapping - Nesne İlişkisel Eşleme) kullanarak veritabanı tablolarını oluşturmak için modeli kullanır; bunlara da model denir.
Gereksinimler
Unix tabanlı bir işletim sistemi üzerinde çalışıyoruz, tercihen Ubuntu 20.04 bulut sunucusu test ettiğimiz sistemdir. Django'yu benzer bir ortamda kurmak istiyorsanız, lütfen şu eğitimimize bakın: “Ubuntu 20.04 Üzerinde Django Nasıl Kurulur ve Geliştirme Ortamı Nasıl Ayarlanır.”
Adım 1. Python Geliştirme Ortamı
Django, Python üzerine kurulmuştur. Bu nedenle, Python uygulamalarıyla çalışmak için gerekli tüm araçlara sahip sağlam bir Python geliştirme ortamına ihtiyacımız var. Bunu daha önce özel bir kılavuzda ele almıştık. Burada kısa bir gösterim yapacağız.
İlk olarak, bir terminal açın ve aşağıdaki komutları çalıştırın:
|
1 2 |
$ sudo apt update && sudo apt upgrade -y $ sudo apt install python3 python-is-python3 |
Ardından, pip – Python paket yöneticisini kurun:
|
1 |
$ sudo apt install python3-pip |
Ardından, bazı ek geliştirme paketlerini kurun:
|
1 |
$ sudo apt install build-essential libssl-dev libffi-dev python3-dev |
Sanal bir ortam oluşturmak için Python venv modülüne de ihtiyacımız var:
|
1 |
$ sudo apt install python3-venv |
Adım 2. MySQL Sunucusunun Kurulması
MySQL, popüler bir ilişkisel veritabanı yönetim sistemidir. Açık kaynaklı, kararlı ve zengin özelliklere sahiptir. Django uygulamamız için veritabanı sunucusu olarak MySQL kullanacağız. APT kullanarak MySQL'i kurun:
|
1 |
$ sudo apt install mysql-server |
Ardından, kurulumu doğrulayın:
|
1 |
$ systemctl status mysql |
Bu, varsayılan seçeneklerle MySQL'in yalnızca temel bir kurulumudur. Daha derinlemesine bilgi için şu kılavuza göz atın: MySQL kurulumu ve yapılandırması.
Adım 3. Django Uygulamasının Kurulması
Artık Django uygulamamızı oluşturmaya hazırız. Django'nun daha derinlemesine bir gösterimiyle ilgileniyorsanız, lütfen şu eğitimimize bakın: “Ubuntu 20.04 Üzerine Django Web Çerçevesinin Kurulması.”
Ardından, uygulama için özel bir dizin oluşturun. Dizin adı proje adını yansıtmalıdır:
|
1 |
$ mkdir -pv <project_dir> |
Proje dizini içinde, venv modülünü kullanarak bir Python sanal ortamı oluşturun:
|
1 |
$ python3 -m venv <virtual_env_name> |
Sanal ortamı etkinleştirin:
|
1 |
$ . sample_app_env/bin/activate |
Şunu kullanarak Django'yu kurun: pip:
|
1 |
$ pip install django |
Ardından, django-admin komutunu kullanarak yeni bir Django projesi oluşturun:
|
1 |
$ django-admin startproject sample_app |
Adım 4. Django Uygulamasının Yapılandırılması
Django uygulaması tüm varsayılan yapılandırmaları içerir. Amacımız için bazı ayarlamalar yapmamız gerekiyor.
Yapılandırma dosyasını düzenleyerek başlayın: settings.py:
|
1 |
$ nano sample_app/sample_app/sample_app/settings.py |
Ardından, saat dilimini değiştirin:
|
1 |
$ TIME_ZONE = '<time_zone>' |
Django uygulama sunucusuna erişmesine izin verilen makineleri ekleyin:
|
1 |
$ ALLOWED_HOSTS = ['<allowed_host_ip_or_domain_name >'] |
Bundan sonra, değişiklikleri uygulayın:
|
1 |
$ python manage.py migrate |
Son olarak, Django web uygulamamız için bir süper kullanıcı oluşturun:
|
1 |
$ python manage.py createsuperuser |
Adım 5. Django Uygulamasını MySQL'e Bağlama
MySQL'e bağlanmak için Django ile uyumlu ek bir Python bağlayıcı kütüphanesine ihtiyacımız var. Şunu kullanacağız: mysqlclient.
İlk olarak, gerekli paketlerin kurulu olduğundan emin olun:
|
1 |
$ sudo apt install python3-dev libmysqlclient-dev default-libmysqlclient-dev |
Ardından, şunu kurun: mysqlclient:
|
1 |
$ pip install mysqlclient |
- Özel Bir Veritabanı Oluşturma
Uygulamamız için özel bir veritabanı ve veritabanı kullanıcısı oluşturmamız gerekiyor. MySQL kabuğunu şu şekilde başlatın: root:
|
1 |
$ sudo mysql -u root |
Django uygulamamız için özel bir veritabanı oluşturun:
|
1 |
$ CREATE DATABASE <dedicated_database>; |
Ardından, Django uygulaması için özel bir veritabanı kullanıcısı oluşturun:
|
1 |
$ CREATE USER '<username>'@'%' IDENTIFIED WITH mysql_native_password BY '<user_password>'; |
Son olarak, özel kullanıcıya özel veritabanı üzerinde tam yetki verin:
|
1 |
$ GRANT ALL ON <database>.* TO '<username'@'%'; |
- Django Yapılandırmasını MySQL Kullanacak Şekilde Değiştirme
Şimdi, MySQL'i veritabanı sunucusu olarak kullanabilmesi için bazı Django yapılandırmalarını düzenlememiz gerekiyor. Bir metin düzenleyicide settings.py dosyasını açın:
|
1 |
$ nano settings.py |
Aşağı kaydırarak şu bölüme gelin: DATABASES ve aşağıdaki kodu yapıştırın:
|
1 2 3 4 5 6 7 8 |
DATABASES = { 'default': { 'ENGINE': 'django.db.backends.mysql', 'OPTIONS': { 'read_default_file': '/etc/mysql/my.cnf', }, } } |
Ardından, gerekli veritabanı kimlik bilgilerini içermesi için MySQL yapılandırma dosyasını düzenleyin:
|
1 |
$ sudo nano /etc/mysql/my.cnf |
Dosyanın sonuna aşağıdaki bloğu ekleyin:
|
1 2 3 4 5 |
[client] database = <dedicated_database> user = <dedicated_user> password = <user_password> default-character-set = utf8 |
Değişikliklerin geçerli olması için MySQL'i yeniden başlatın:
|
1 2 |
$ sudo systemctl daemon-reload $ sudo systemctl restart mysql |
Adım 6. Django Modeli Oluşturma
Artık Django projemiz içinde yeni bir model oluşturmaya hazırız. Sanal ortamı etkinleştirin:
|
1 2 3 |
$ cd sample_app/ $ . sample_app_env/bin/activate $ cd sample_app/ |
Bu konumda, Django'ya yeni bir uygulama oluşturmasını söyleyin:
|
1 |
$ python manage.py startapp <new_app> |
Oluşturduktan sonra, dosya ağacı şuna benzer görünmelidir. Burada, models.py dosyası özel Django modelimiz için kodları içerecektir:
Dosyanın mevcut içeriğini kontrol edin:
|
1 |
$ cat models.py |
Gösterim amacıyla, Post adında blog gönderileri için bir model oluşturacağız. Aşağıdaki alanları içerecektir:
title: Blog gönderisi başlığı.slug: Web sayfaları için geçerli URL'ler depolar ve oluşturur.content: Blog gönderisi metni.created_on: Gönderinin oluşturulma tarihi.author: Gönderiyi oluşturan kullanıcı.
Bir metin düzenleyicide models.py dosyasını açın:
|
1 |
$ nano models.py |
Modelimiz için gerekli bazı API'leri içe aktaralım. Varsayılan olarak, models API'sini içe aktarır. Ayrıca slug oluşturmak için slugify API'sine, kimlik doğrulama için User modeline ve daha iyi ve esnek bir URL oluşturma için reverse fonksiyonuna ihtiyacımız olacak:
|
1 2 3 4 |
from django.db import models from django.template.defaultfilters import slugify from django.contrib.auth.models import User from django.urls import reverse |
Ardından, Post adında sınıfı ekleyin. Bu sınıf, şu gibi gerekli veritabanı alanlarını içerecektir: title, slug, content, created_on, ve author:
|
1 2 3 4 5 6 |
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() |
URL oluşturma ve gönderiyi kaydetme işlevselliğine ihtiyacımız var. Benzersiz gönderilerle eşleşen benzersiz bağlantılar oluşturduğu için bu önemlidir:
|
1 2 3 4 5 6 7 |
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) |
Bir sonraki bölüm, modele gönderiyi sıralama ve web sayfasında görüntüleme talimatını verecektir. Mantığı dahili bir sınıf kullanarak kodlayacağız, Meta. Bu sınıf, veritabanı alanı tanımını ilgilendirmeyen ek model mantığı içerecektir:
|
1 2 3 4 5 |
class Meta: ordering = ['created_on'] def __unicode__(self): return self.title |
Son olarak, bu dosyada Comment modelinin özelliğine sahip olacağız. Bu, Comment sınıfını models.Model imzasını kullanarak eklemeyi gerektirir. Aşağıdaki veritabanı alanlarını içerecektir:
- name: Yorum yapanın adı.
- email: Yorum yapanın e-posta adresi.
- text: Yorumun kendi içeriği.
- post: Yorumun yapıldığı gönderi.
- created_on: Yorumun oluşturulma zamanı.
Kod şuna benzer görünecektir:
|
1 2 3 4 5 6 7 |
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) created_on = models.DateTimeField(auto_now_add=True) |
Bu noktada, models.py dosyamız şu şekilde görünecektir:
Son olarak, dosyayı kaydedin ve düzenleyiciyi kapatın.
Adım 7. Django Ayarlarını Güncelleme
Model oluşturuldu. Ancak, modeli harekete geçirmek için bazı yapılandırma dosyalarında ince ayar yapmamız gerekiyor. settings.py dosyasının içinde, modelimizi INSTALLED_APPS.
Bir metin düzenleyicide settings.py dosyasını açın:
|
1 |
$ nano settings.py |
Yeni modülü şu bölümün altına kaydedin: INSTALLED_APPS:
Dosyayı kaydedin ve düzenleyiciyi kapatın.
Adım 8. Değişiklikleri Taşıma (Migration)
İstediğimiz tüm modelleri eklediğimize göre, bir sonraki adım bu değişiklikleri uygulamaktır. Django bu şemaları MySQL veritabanımıza uygulayacaktır.
Aşağıdaki komut gerekli tüm taşıma (migration) dosyalarını oluşturacaktır. Çıktı, bu dosyaların proje dizini içindeki konumlarını gösterecektir:
|
1 |
$ python manage.py makemigrations |
Aşağıdaki komut mevcut tüm taşımaları listeleyecektir:
|
1 |
$ python manage.py showmigrations |
Şu hariç tüm taşımaların işaretlendiğini unutmayın: 0001_initial (bu, Post ve Comment modellerinin bir parçası olarak oluşturulmuştu).
Aşağıdaki komut, Django'nun taşımaları gerçekleştirmek için hangi SQL sorgusunu yürüteceğini gösterecektir:
|
1 |
$ python manage.py sqlmigrate random_app 0001_initial |
Şimdi tek yapmamız gereken taşımaları uygulamaktır. Bu taşımalar değişiklikleri veritabanına yazacaktır:
|
1 |
$ python manage.py migrate |
Step 9. Verifying Changes
Değişiklikleri doğrulamak için MySQL veritabanımıza bir göz atalım. MySQL kabuğunu Django kullanıcısı olarak başlatın:
|
1 |
$ mysql sample_app_data -u sample_app_user |
Ardından, mevcut aktif veritabanını Django uygulaması veritabanı olarak değiştirin:
|
1 |
$ USE <django_dedicated_database>; |
Veritabanındaki tüm tabloları listeleyin:
|
1 |
$ SHOW TABLES; |
Son olarak, tablolardan herhangi birinin içeriğini görmek için DESCRIBE sorgusunu kullanın:
|
1 2 |
$ DESCRIBE random_app_comment; $ DESCRIBE random_app_post; |
MySQL ile Django Sınırlamaları
Django uygulamanız için veritabanı sunucusu olarak MySQL kullanırken aklınızda bulundurmanız gereken birkaç şey vardır:
- Şema değiştiren süreçler etrafındaki transaction (işlem) desteği oldukça sınırlıdır. Yani, bir migrasyon başarısız olursa, başka bir migrasyonu denemeden önce tüm değişikliklerin manuel olarak geri alınması gerekir. Başarısız migrasyonun gerçekleşmediği daha önceki bir noktaya geri dönmenin hiçbir yolu yoktur.
- Şema değiştiren süreçlerin çoğu için MySQL tabloları tamamen yeniden yazar. Belirli durumlarda bu gerçekten zaman alıcı olabilir. En kötü ihtimalle, zaman karmaşıklığı eklenecek satır sayısı veya kaldırılacak sütun sayısı ile orantılı olacaktır. Resmi Django belgelerine göre, milyon satır başına bir dakika sürebilir.
- MySQL; sütun, tablo ve dizin adlarının uzunlukları için bir karakter sınırı uygular. Ayrıca tüm sütunların ve dizin kapsamlarının toplam boyutu üzerinde de bir sınır vardır. Django bu sınırın üzerine çıkabilir. MySQL dışındaki bazı arka uçlar Django'nun bu daha yüksek sınırını destekleyebilir.
Bu nedenle, seçeneklerinizi tartmanız ve uygun olanı seçmeniz önemle tavsiye edilir.
Son Düşünceler
Bu kılavuz, mevcut bir Django uygulamasına modüllerin nasıl ekleneceğini başarıyla göstermektedir. Uygulama için arka uç olarak MySQL kullandık. Ayrıca modeller, migrasyonun nasıl çalıştığı ve Django'nun modelleri MySQL veritabanı tablolarına nasıl dönüştürdüğü gibi bazı temel Django kavramlarını da sergilemektedir.
Keyifli Çalışmalar!





















Yorumlar
Henüz yorum yapılmamış. İlk siz olun.