{"id":35344,"date":"2025-11-28T15:41:05","date_gmt":"2025-11-28T12:41:05","guid":{"rendered":"https:\/\/fatihsoysal.com\/blog\/?p=35344"},"modified":"2025-11-28T15:41:05","modified_gmt":"2025-11-28T12:41:05","slug":"jumping-into-django-models-veri-modellemenin-kalbine-bir-dalis","status":"publish","type":"post","link":"https:\/\/fatihsoysal.com\/blog\/jumping-into-django-models-veri-modellemenin-kalbine-bir-dalis\/","title":{"rendered":"Jumping Into Django Models: Veri Modellemenin Kalbine Bir Dal\u0131\u015f"},"content":{"rendered":"<p><body><\/p>\n<h2>Jumping Into Django Models: Veri Modellemenin Kalbine Bir Dal\u0131\u015f<\/h2>\n<p>Django, h\u0131zl\u0131 ve verimli web uygulamalar\u0131 geli\u015ftirmek i\u00e7in tasarlanm\u0131\u015f, y\u00fcksek seviyeli bir Python web \u00e7at\u0131s\u0131d\u0131r. &#8220;Batteries included&#8221; felsefesiyle, geli\u015ftiricilerin veritaban\u0131 etkile\u015fiminden URL y\u00f6nlendirmesine, kullan\u0131c\u0131 kimlik do\u011frulamas\u0131ndan y\u00f6netim paneline kadar bir\u00e7ok temel ihtiyac\u0131n\u0131 kar\u015f\u0131layacak ara\u00e7lar sunar. Bu ara\u00e7lar\u0131n merkezinde, uygulaman\u0131z\u0131n verilerini tan\u0131mlaman\u0131z\u0131 ve onlarla etkile\u015fim kurman\u0131z\u0131 sa\u011flayan Django Modelleri yer al\u0131r. Django Modelleri, bir web uygulamas\u0131n\u0131n &#8220;MVT&#8221; (Model-View-Template) mimarisindeki &#8220;M&#8221; harfini temsil eder ve uygulaman\u0131z\u0131n veri katman\u0131n\u0131 olu\u015fturur.<\/p>\n<p>Bu makalede, Django Modellerinin derinliklerine inecek, ne olduklar\u0131n\u0131, neden bu kadar g\u00fc\u00e7l\u00fc olduklar\u0131n\u0131 ve ger\u00e7ek d\u00fcnya senaryolar\u0131nda nas\u0131l kullan\u0131ld\u0131klar\u0131n\u0131 ad\u0131m ad\u0131m ke\u015ffedece\u011fiz. Temel model tan\u0131mlamalar\u0131ndan karma\u015f\u0131k ili\u015fkilere, g\u00fc\u00e7l\u00fc sorgu setlerinden \u00f6zel model metotlar\u0131na kadar geni\u015f bir yelpazeyi ele alarak, Django Modelleri ile \u00e7al\u0131\u015fmaya ba\u015flaman\u0131z i\u00e7in sa\u011flam bir temel olu\u015fturaca\u011f\u0131z.<\/p>\n<h3>Temel Kavramlar ve Avantajlar\u0131<\/h3>\n<p>Django Modelleri, uygulaman\u0131z\u0131n veritaban\u0131 \u015femas\u0131n\u0131 tan\u0131mlayan Python s\u0131n\u0131flar\u0131d\u0131r. Her model s\u0131n\u0131f\u0131, veritaban\u0131ndaki bir tabloyu temsil eder ve bu s\u0131n\u0131f\u0131n her bir niteli\u011fi (attribute) ise o tablonun bir s\u00fctununa kar\u015f\u0131l\u0131k gelir. Bu soyutlama katman\u0131, geli\u015ftiricilerin SQL sorgular\u0131 yazmak zorunda kalmadan Python kodlar\u0131 arac\u0131l\u0131\u011f\u0131yla veritaban\u0131 ile etkile\u015fim kurmas\u0131n\u0131 sa\u011flar.<\/p>\n<h4>ORM (Object-Relational Mapping) Nedir?<\/h4>\n<p>Django Modellerinin temelinde, bir ORM (Object-Relational Mapping) arac\u0131 yatar. ORM, nesne y\u00f6nelimli programlama dillerindeki (bu durumda Python) s\u0131n\u0131flar\u0131 ve nesneleri, ili\u015fkisel veritabanlar\u0131ndaki tablolar ve sat\u0131rlarla e\u015fle\u015ftiren bir tekniktir. Django&#8217;nun ORM&#8217;si sayesinde:<\/p>\n<p>*   <strong>Veritaban\u0131 Ba\u011f\u0131ms\u0131zl\u0131\u011f\u0131:<\/strong> Uygulaman\u0131z\u0131 PostgreSQL, MySQL, SQLite veya Oracle gibi farkl\u0131 veritaban\u0131 sistemlerinde, kodunuzda b\u00fcy\u00fck de\u011fi\u015fiklikler yapmadan \u00e7al\u0131\u015ft\u0131rabilirsiniz. ORM, Python objelerini veritaban\u0131na \u00f6zg\u00fc SQL ifadelerine \u00e7evirme i\u015fini \u00fcstlenir.<br \/>\n*   <strong>Daha Az SQL Kodu:<\/strong> Veritaban\u0131 i\u015flemlerini (olu\u015fturma, okuma, g\u00fcncelleme, silme &#8211; CRUD) do\u011frudan Python objeleri ve metotlar\u0131 arac\u0131l\u0131\u011f\u0131yla yapars\u0131n\u0131z. Bu, geli\u015ftirme s\u00fcrecini h\u0131zland\u0131r\u0131r ve SQL enjeksiyonu gibi yayg\u0131n g\u00fcvenlik a\u00e7\u0131klar\u0131n\u0131n \u00f6n\u00fcne ge\u00e7er.<br \/>\n*   <strong>Daha Okunabilir ve Bak\u0131m\u0131 Kolay Kod:<\/strong> Veritaban\u0131 \u015feman\u0131z, a\u00e7\u0131k\u00e7a tan\u0131mlanm\u0131\u015f Python s\u0131n\u0131flar\u0131 olarak temsil edildi\u011finden, kodunuz daha anla\u015f\u0131l\u0131r ve bak\u0131m\u0131 daha kolay hale gelir.<br \/>\n*   <strong>Pythonic Yakla\u015f\u0131m:<\/strong> Verilerinizle t\u0131pk\u0131 normal Python objeleriyle \u00e7al\u0131\u015f\u0131r gibi etkile\u015fim kurars\u0131n\u0131z.<\/p>\n<h4>Model Tan\u0131mlaman\u0131n Temelleri<\/h4>\n<p>Bir Django modeli tan\u0131mlamak olduk\u00e7a basittir. Genellikle, her Django uygulamas\u0131 i\u00e7in <code>models.py<\/code> ad\u0131nda bir dosya bulunur ve modeller bu dosyan\u0131n i\u00e7ine yaz\u0131l\u0131r. T\u00fcm modeller <code>django.db.models.Model<\/code> s\u0131n\u0131f\u0131ndan miras almal\u0131d\u0131r.<\/p>\n<p>\u0130\u015fte basit bir <code>Kitap<\/code> modelinin tan\u0131m\u0131:<\/p>\n<pre><code class=\"language-python\">from django.db import models\n\nclass Kitap(models.Model):\n    baslik = models.CharField(max_length=200)\n    yazar = models.CharField(max_length=100)\n    yayin_tarihi = models.DateField()\n    isbn = models.CharField(max_length=13, unique=True)\n    sayfa_sayisi = models.IntegerField(null=True, blank=True)\n    fiyat = models.DecimalField(max_digits=5, decimal_places=2, null=True, blank=True)\n    stok_durumu = models.BooleanField(default=True)\n\n    def __str__(self):\n        return self.baslik<\/code><\/pre>\n<p>Bu \u00f6rnekte:<br \/>\n*   <code>Kitap<\/code> s\u0131n\u0131f\u0131, veritaban\u0131nda <code>myapp_kitap<\/code> (varsay\u0131lan olarak uygulama ad\u0131 ve model ad\u0131n\u0131n k\u00fc\u00e7\u00fck harfle birle\u015fimi) ad\u0131nda bir tabloya kar\u015f\u0131l\u0131k gelir.<br \/>\n*   <code>baslik<\/code>, <code>yazar<\/code>, <code>yayin_tarihi<\/code> gibi nitelikler, bu tablonun s\u00fctunlar\u0131d\u0131r.<br \/>\n*   Her nitelik, veritaban\u0131nda saklanacak verinin t\u00fcr\u00fcn\u00fc belirten bir <code>Field<\/code> objesidir (\u00f6rn. <code>CharField<\/code>, <code>DateField<\/code>).<br \/>\n*   <code>max_length<\/code>, <code>unique<\/code>, <code>null<\/code>, <code>blank<\/code>, <code>default<\/code> gibi arg\u00fcmanlar, alan\u0131n davran\u0131\u015f\u0131n\u0131 ve veritaban\u0131 k\u0131s\u0131tlamalar\u0131n\u0131 tan\u0131mlar.<\/p>\n<p>Modellerinizi tan\u0131mlad\u0131ktan sonra, Django&#8217;nun bu modelleri veritaban\u0131 \u015femas\u0131na d\u00f6n\u00fc\u015ft\u00fcrmesi i\u00e7in iki komutu \u00e7al\u0131\u015ft\u0131rman\u0131z gerekir:<br \/>\n1.  <code>python manage.py makemigrations<\/code>: Modellerinizdeki de\u011fi\u015fiklikleri alg\u0131lar ve bu de\u011fi\u015fiklikleri uygulayacak bir ge\u00e7i\u015f (migration) dosyas\u0131 olu\u015fturur.<br \/>\n2.  <code>python manage.py migrate<\/code>: Olu\u015fturulan ge\u00e7i\u015f dosyalar\u0131n\u0131 veritaban\u0131na uygular, yani tablolar\u0131 ve s\u00fctunlar\u0131 olu\u015fturur veya g\u00fcnceller.<\/p>\n<p>Bu ad\u0131mlar, geli\u015ftirme s\u00fcrecinizde veritaban\u0131 \u015feman\u0131z\u0131 model tan\u0131mlar\u0131n\u0131zla senkronize tutman\u0131n anahtar\u0131d\u0131r.<\/p>\n<h3>Model Alan T\u00fcrleri (Field Types)<\/h3>\n<p>Django, \u00e7ok \u00e7e\u015fitli veri t\u00fcrlerini desteklemek i\u00e7in zengin bir alan t\u00fcrleri koleksiyonu sunar. Her alan t\u00fcr\u00fc, veritaban\u0131nda belirli bir veri tipine e\u015flenir ve Python taraf\u0131nda uygun veri t\u00fcrlerini i\u015fler.<\/p>\n<h4>S\u0131k Kullan\u0131lan Alan T\u00fcrleri<\/h4>\n<p>*   <code>models.CharField(max_length=...)<\/code>: K\u0131sa metin dizileri i\u00e7in kullan\u0131l\u0131r. <code>max_length<\/code> zorunlu bir arg\u00fcmand\u0131r ve veritaban\u0131nda bu alan\u0131n alabilece\u011fi maksimum karakter say\u0131s\u0131n\u0131 belirtir.<br \/>\n*   <code>models.TextField()<\/code>: Uzun metinler i\u00e7in kullan\u0131l\u0131r. <code>CharField<\/code>&#8216;dan farkl\u0131 olarak <code>max_length<\/code> arg\u00fcman\u0131 zorunlu de\u011fildir ve genellikle metin alanlar\u0131 i\u00e7in daha b\u00fcy\u00fck boyutlara izin verir.<br \/>\n*   <code>models.IntegerField()<\/code>: Tam say\u0131lar i\u00e7in.<br \/>\n*   <code>models.PositiveIntegerField()<\/code>: Pozitif tam say\u0131lar (s\u0131f\u0131r dahil) i\u00e7in.<br \/>\n*   <code>models.SmallIntegerField()<\/code>: K\u00fc\u00e7\u00fck tam say\u0131lar i\u00e7in.<br \/>\n*   <code>models.BooleanField(default=False)<\/code>: True\/False de\u011ferleri i\u00e7in. Genellikle bir varsay\u0131lan de\u011fer (<code>default<\/code>) ile kullan\u0131l\u0131r.<br \/>\n*   <code>models.DateField()<\/code>: Tarih de\u011ferleri i\u00e7in (\u00f6rn. <code>YYYY-MM-DD<\/code>).<br \/>\n    *   <code>auto_now_add=True<\/code>: Obje ilk olu\u015fturuldu\u011funda otomatik olarak mevcut tarihi ayarlar. Yaln\u0131zca olu\u015fturma an\u0131nda bir kez ayarlan\u0131r.<br \/>\n    *   <code>auto_now=True<\/code>: Obje her kaydedildi\u011finde otomatik olarak mevcut tarihi g\u00fcnceller.<br \/>\n*   <code>models.DateTimeField()<\/code>: Tarih ve saat de\u011ferleri i\u00e7in (\u00f6rn. <code>YYYY-MM-DD HH:MM:SS<\/code>). <code>auto_now_add<\/code> ve <code>auto_now<\/code> arg\u00fcmanlar\u0131 burada da ge\u00e7erlidir.<br \/>\n*   <code>models.DecimalField(max_digits=..., decimal_places=...)<\/code>: Ondal\u0131kl\u0131 say\u0131lar i\u00e7in.<br \/>\n    *   <code>max_digits<\/code>: Say\u0131daki toplam basamak say\u0131s\u0131 (ondal\u0131k basamaklar dahil).<br \/>\n    *   <code>decimal_places<\/code>: Ondal\u0131k noktas\u0131ndan sonraki basamak say\u0131s\u0131.<br \/>\n*   <code>models.EmailField(max_length=...)<\/code>: E-posta adresleri i\u00e7in \u00f6zel do\u011frulama sa\u011flar. <code>CharField<\/code>&#8216;dan miras al\u0131r.<br \/>\n*   <code>models.URLField(max_length=...)<\/code>: URL&#8217;ler i\u00e7in \u00f6zel do\u011frulama sa\u011flar. <code>CharField<\/code>&#8216;dan miras al\u0131r.<br \/>\n*   <code>models.FileField(upload_to=...)<\/code>: Dosya y\u00fcklemek i\u00e7in kullan\u0131l\u0131r. <code>upload_to<\/code> arg\u00fcman\u0131, dosyalar\u0131n sunucuda hangi dizine y\u00fcklenece\u011fini belirtir.<br \/>\n*   <code>models.ImageField(upload_to=...)<\/code>: Resim dosyalar\u0131 i\u00e7in kullan\u0131l\u0131r. <code>FileField<\/code>&#8216;dan miras al\u0131r ve ek olarak resim do\u011frulama \u00f6zellikleri sunar.<\/p>\n<h4>Alan Se\u00e7enekleri (Field Options)<\/h4>\n<p>Her alan t\u00fcr\u00fc, davran\u0131\u015f\u0131n\u0131 daha da \u00f6zelle\u015ftirmek i\u00e7in bir dizi ortak arg\u00fcman\u0131 kabul eder:<\/p>\n<p>*   <code>null=True<\/code>: Veritaban\u0131nda bu alan\u0131n <code>NULL<\/code> de\u011ferini almas\u0131na izin verir. Varsay\u0131lan olarak <code>False<\/code>&#8216;tur.<br \/>\n*   <code>blank=True<\/code>: Django y\u00f6netim paneli ve formlar\u0131nda bu alan\u0131n bo\u015f b\u0131rak\u0131lmas\u0131na izin verir. <code>null<\/code> ile kar\u0131\u015ft\u0131r\u0131lmamal\u0131d\u0131r; <code>blank<\/code> do\u011frulama ile ilgilidir, <code>null<\/code> veritaban\u0131 ile. Varsay\u0131lan olarak <code>False<\/code>&#8216;tur.<br \/>\n*   <code>default=...<\/code>: Alan bo\u015f b\u0131rak\u0131ld\u0131\u011f\u0131nda kullan\u0131lacak varsay\u0131lan de\u011feri ayarlar.<br \/>\n*   <code>unique=True<\/code>: Veritaban\u0131nda bu alan\u0131n de\u011ferlerinin benzersiz olmas\u0131n\u0131 sa\u011flar.<br \/>\n*   <code>primary_key=True<\/code>: Bu alan\u0131 modelin birincil anahtar\u0131 yapar. Django her modele otomatik olarak <code>id<\/code> ad\u0131nda bir <code>AutoField<\/code> birincil anahtar ekledi\u011fi i\u00e7in genellikle manuel olarak ayarlaman\u0131za gerek kalmaz.<br \/>\n*   <code>verbose_name=\"Okunabilir \u0130sim\"<\/code>: Y\u00f6netici paneli ve formlarda alan\u0131n daha kullan\u0131c\u0131 dostu bir adla g\u00f6r\u00fcnt\u00fclenmesini sa\u011flar. Belirtilmezse, alan ad\u0131n\u0131n ilk harfi b\u00fcy\u00fck yap\u0131l\u0131r ve alt \u00e7izgiler bo\u015fluklarla de\u011fi\u015ftirilir.<br \/>\n*   <code>help_text=\"Bu alan hakk\u0131nda yard\u0131m metni\"<\/code>: Y\u00f6netici paneli ve formlarda alan\u0131n yan\u0131nda k\u00fc\u00e7\u00fck bir yard\u0131m metni g\u00f6r\u00fcnt\u00fcler.<br \/>\n*   <code>choices=[('value1', 'Display Name 1'), ('value2', 'Display Name 2')]<\/code>: Bir dizi se\u00e7enek sunar. Veritaban\u0131na <code>value<\/code> kaydedilirken, formlarda <code>Display Name<\/code> g\u00f6sterilir.<\/p>\n<pre><code class=\"language-python\">class Urun(models.Model):\n    ADET_BIRIMLERI = [\n        ('ADET', 'Adet'),\n        ('KG', 'Kilogram'),\n        ('LT', 'Litre'),\n    ]\n\n    ad = models.CharField(max_length=100, verbose_name=\"\u00dcr\u00fcn Ad\u0131\")\n    fiyat = models.DecimalField(max_digits=10, decimal_places=2)\n    stok = models.IntegerField(default=0)\n    birim = models.CharField(max_length=4, choices=ADET_BIRIMLERI, default='ADET')\n    aciklama = models.TextField(blank=True, null=True, help_text=\"\u00dcr\u00fcn\u00fcn detayl\u0131 a\u00e7\u0131klamas\u0131\")\n    eklenme_tarihi = models.DateTimeField(auto_now_add=True)\n    guncellenme_tarihi = models.DateTimeField(auto_now=True)\n\n    class Meta:\n        ordering = ['ad']\n        verbose_name = \"\u00dcr\u00fcn\"\n        verbose_name_plural = \"\u00dcr\u00fcnler\"\n\n    def __str__(self):\n        return self.ad<\/code><\/pre>\n<p>Bu \u00f6rnekte, <code>birim<\/code> alan\u0131 i\u00e7in <code>choices<\/code> kullan\u0131larak sadece belirli de\u011ferlerin se\u00e7ilebilmesi sa\u011flanm\u0131\u015ft\u0131r. Ayr\u0131ca <code>verbose_name<\/code>, <code>help_text<\/code>, <code>auto_now_add<\/code> ve <code>auto_now<\/code> gibi se\u00e7eneklerin kullan\u0131m\u0131 da g\u00f6sterilmi\u015ftir.<\/p>\n<h3>\u0130li\u015fkiler (Relationships)<\/h3>\n<p>Ger\u00e7ek d\u00fcnya uygulamalar\u0131nda veriler genellikle birbirine ba\u011fl\u0131d\u0131r. Django Modelleri, ili\u015fkisel veritabanlar\u0131ndaki tablo ili\u015fkilerini (bire-bir, bire-\u00e7ok, \u00e7oka-\u00e7ok) kolayca tan\u0131mlaman\u0131za olanak tan\u0131r.<\/p>\n<h4>Bir-\u00c7ok \u0130li\u015fkisi (ForeignKey)<\/h4>\n<p>En yayg\u0131n ili\u015fki t\u00fcr\u00fcd\u00fcr. Bir modelin bir\u00e7ok \u00f6rne\u011finin ba\u015fka bir modelin tek bir \u00f6rne\u011fine ba\u011fl\u0131 oldu\u011fu durumu ifade eder. \u00d6rne\u011fin, bir yazar\u0131n birden fazla kitab\u0131 olabilir, ancak her kitap yaln\u0131zca bir yazara aittir.<\/p>\n<pre><code class=\"language-python\">class Yazar(models.Model):\n    ad = models.CharField(max_length=100)\n    soyad = models.CharField(max_length=100)\n    dogum_tarihi = models.DateField(null=True, blank=True)\n\n    def __str__(self):\n        return f\"{self.ad} {self.soyad}\"\n\nclass Kitap(models.Model):\n    baslik = models.CharField(max_length=200)\n    # ForeignKey ile Yazar modeline ba\u011flan\u0131yoruz\n    yazar = models.ForeignKey(Yazar, on_delete=models.CASCADE)\n    yayin_tarihi = models.DateField()\n\n    def __str__(self):\n        return self.baslik<\/code><\/pre>\n<p><code>models.ForeignKey<\/code> alan\u0131n\u0131 tan\u0131mlarken, ilk arg\u00fcman olarak ili\u015fkili modelin ad\u0131n\u0131 (veya string olarak &#8216;UygulamaAd\u0131.ModelAd\u0131&#8217;) verirsiniz. \u0130kinci zorunlu arg\u00fcman <code>on_delete<\/code>, ili\u015fkili obje silindi\u011finde ne olaca\u011f\u0131n\u0131 belirtir:<br \/>\n*   <code>models.CASCADE<\/code>: \u0130li\u015fkili obje silindi\u011finde, bu objeyi de sil. (En yayg\u0131n ve varsay\u0131lan davran\u0131\u015f)<br \/>\n*   <code>models.PROTECT<\/code>: \u0130li\u015fkili objeler varsa bu objenin silinmesini engelle.<br \/>\n*   <code>models.SET_NULL<\/code>: \u0130li\u015fkili obje silindi\u011finde bu alan\u0131 <code>NULL<\/code> olarak ayarla. (<code>null=True<\/code> ile birlikte kullan\u0131lmal\u0131d\u0131r.)<br \/>\n*   <code>models.SET_DEFAULT<\/code>: \u0130li\u015fkili obje silindi\u011finde bu alan\u0131 varsay\u0131lan de\u011fere ayarla. (<code>default<\/code> ile birlikte kullan\u0131lmal\u0131d\u0131r.)<br \/>\n*   <code>models.DO_NOTHING<\/code>: \u0130li\u015fkili obje silindi\u011finde hi\u00e7bir \u015fey yapma. (Veritaban\u0131 tutars\u0131zl\u0131\u011f\u0131na yol a\u00e7abilir, dikkatli kullan\u0131lmal\u0131.)<br \/>\n*   <code>models.RESTRICT<\/code>: \u0130li\u015fkili objeler varsa bu objenin silinmesini engelle, ancak <code>PROTECT<\/code>&#8216;ten farkl\u0131 olarak veritaban\u0131 seviyesinde k\u0131s\u0131tlama uygulan\u0131r.<\/p>\n<p><code>related_name<\/code> arg\u00fcman\u0131, ili\u015fkili modelden (bu \u00f6rnekte <code>Yazar<\/code>&#8216;dan) bu modele (yani <code>Kitap<\/code>&#8216;a) geri d\u00f6n\u00fc\u015f sorgular\u0131n\u0131 yaparken kullan\u0131lacak isimdir. \u00d6rne\u011fin, <code>yazar.kitap_set.all()<\/code> yerine <code>yazar.kitaplar.all()<\/code> yazmak i\u00e7in:<\/p>\n<pre><code class=\"language-python\">class Kitap(models.Model):\n    # ...\n    yazar = models.ForeignKey(Yazar, on_delete=models.CASCADE, related_name='kitaplar')\n    # ...<\/code><\/pre>\n<p>\u015eimdi <code>yazar_objesi.kitaplar.all()<\/code> ile o yazar\u0131n t\u00fcm kitaplar\u0131na eri\u015febilirsiniz.<\/p>\n<h4>Bir-Bir \u0130li\u015fkisi (OneToOneField)<\/h4>\n<p>Bir modelin her \u00f6rne\u011finin ba\u015fka bir modelin yaln\u0131zca bir \u00f6rne\u011fiyle ili\u015fkili oldu\u011fu durumu ifade eder. Genellikle bir modelin temel \u00f6zelliklerini ana modelden ay\u0131rmak veya bir kullan\u0131c\u0131n\u0131n profil bilgilerini ayr\u0131 bir modelde tutmak gibi senaryolarda kullan\u0131l\u0131r.<\/p>\n<pre><code class=\"language-python\">from django.contrib.auth.models import User\n\nclass KullaniciProfili(models.Model):\n    user = models.OneToOneField(User, on_delete=models.CASCADE)\n    telefon = models.CharField(max_length=15, blank=True, null=True)\n    adres = models.CharField(max_length=255, blank=True, null=True)\n    profil_resmi = models.ImageField(upload_to='profil_resimleri\/', blank=True, null=True)\n\n    def __str__(self):\n        return self.user.username<\/code><\/pre>\n<p>Burada, her <code>User<\/code> objesi yaln\u0131zca bir <code>KullaniciProfili<\/code> objesine sahip olabilir ve tersi de ge\u00e7erlidir. <code>User<\/code> objesinden <code>user_objesi.kullaniciprofili<\/code> ile profile eri\u015filebilir.<\/p>\n<h4>\u00c7ok-\u00c7ok \u0130li\u015fkisi (ManyToManyField)<\/h4>\n<p>Bir modelin birden \u00e7ok \u00f6rne\u011finin ba\u015fka bir modelin birden \u00e7ok \u00f6rne\u011fiyle ili\u015fkili oldu\u011fu durumu ifade eder. \u00d6rne\u011fin, bir kitap birden fazla kategoriye ait olabilir ve bir kategori birden fazla kitaba sahip olabilir.<\/p>\n<pre><code class=\"language-python\">class Kategori(models.Model):\n    ad = models.CharField(max_length=50, unique=True)\n\n    def __str__(self):\n        return self.ad\n\nclass Kitap(models.Model):\n    baslik = models.CharField(max_length=200)\n    yazar = models.ForeignKey(Yazar, on_delete=models.CASCADE)\n    # ManyToManyField ile Kategori modeline ba\u011flan\u0131yoruz\n    kategoriler = models.ManyToManyField(Kategori)\n\n    def __str__(self):\n        return self.baslik<\/code><\/pre>\n<p><code>ManyToManyField<\/code> kullan\u0131ld\u0131\u011f\u0131nda, Django otomatik olarak bu iki model aras\u0131nda bir ara tablo (intermediate table) olu\u015fturur. Bu tablo, her kitab\u0131n hangi kategorilere ait oldu\u011funu ve her kategorinin hangi kitaplar\u0131 i\u00e7erdi\u011fini tutar. \u0130li\u015fkiye obje eklemek i\u00e7in <code>kitap_objesi.kategoriler.add(kategori_objesi)<\/code> veya <code>kitap_objesi.kategoriler.set([kategori1, kategori2])<\/code> gibi metotlar kullan\u0131l\u0131r.<\/p>\n<h3>Model Y\u00f6neticileri (Managers) ve Sorgular (Queries)<\/h3>\n<p>Django ORM&#8217;nin en g\u00fc\u00e7l\u00fc y\u00f6nlerinden biri, veritaban\u0131ndan veri almak i\u00e7in sundu\u011fu esnek ve Pythonic sorgu API&#8217;sidir. Her model, varsay\u0131lan olarak <code>objects<\/code> ad\u0131nda bir <code>Manager<\/code>&#8216;a sahiptir. Bu <code>Manager<\/code> objesi, veritaban\u0131 sorgular\u0131n\u0131 y\u00fcr\u00fctmek i\u00e7in ana giri\u015f noktas\u0131d\u0131r.<\/p>\n<h4>Temel Sorgu Y\u00f6ntemleri<\/h4>\n<p>*   <strong>T\u00fcm objeleri alma:<\/strong> <code>Model.objects.all()<\/code><\/p>\n<pre><code class=\"language-python\">tum_kitaplar = Kitap.objects.all()<\/code><\/pre>\n<p>*   <strong>Belirli bir objeyi alma (get):<\/strong> <code>Model.objects.get(pk=1)<\/code> veya <code>Model.objects.get(baslik='Sava\u015f ve Bar\u0131\u015f')<\/code>. Tek bir sonu\u00e7 beklenir. Birden fazla sonu\u00e7 veya hi\u00e7 sonu\u00e7 yoksa hata f\u0131rlat\u0131r (<code>MultipleObjectsReturned<\/code> veya <code>DoesNotExist<\/code>).<\/p>\n<pre><code class=\"language-python\">kitap = Kitap.objects.get(id=1)<\/code><\/pre>\n<p>*   <strong>Filtreleme (filter):<\/strong> <code>Model.objects.filter(field='value')<\/code>. Bir <code>QuerySet<\/code> d\u00f6nd\u00fcr\u00fcr (sonu\u00e7 k\u00fcmesi).<\/p>\n<pre><code class=\"language-python\">tolstoy_kitaplari = Kitap.objects.filter(yazar__soyad='Tolstoy')<\/code><\/pre>\n<p>*   <strong>Hari\u00e7 Tutma (exclude):<\/strong> <code>Model.objects.exclude(field='value')<\/code>. Belirtilen kriterlere uyanlar\u0131 hari\u00e7 tutar.<\/p>\n<pre><code class=\"language-python\">diger_kitaplar = Kitap.objects.exclude(yazar__soyad='Tolstoy')<\/code><\/pre>\n<p>*   <strong>Yeni obje olu\u015fturma ve kaydetme:<\/strong><\/p>\n<pre><code class=\"language-python\">yeni_kitap = Kitap.objects.create(baslik='Yeni Kitap', yazar=yazar_objesi, yayin_tarihi='2023-01-01')\n    # Veya\n    yeni_kitap = Kitap(baslik='Yeni Kitap 2', yazar=yazar_objesi, yayin_tarihi='2023-02-01')\n    yeni_kitap.save() # Obje veritaban\u0131na kaydedilir<\/code><\/pre>\n<p>*   <strong>Toplu olu\u015fturma:<\/strong> <code>Model.objects.bulk_create([...])<\/code>. Tek bir veritaban\u0131 sorgusuyla birden fazla obje olu\u015fturmak i\u00e7in performansl\u0131 bir y\u00f6ntem.<br \/>\n*   <strong>G\u00fcncelleme:<\/strong> Mevcut bir objeyi al\u0131p niteliklerini de\u011fi\u015ftirip <code>save()<\/code> metoduyla kaydedebilirsiniz.<\/p>\n<pre><code class=\"language-python\">kitap = Kitap.objects.get(id=1)\n    kitap.fiyat = 29.99\n    kitap.save()<\/code><\/pre>\n<p>*   <strong>Toplu g\u00fcncelleme:<\/strong> <code>QuerySet<\/code> \u00fczerinde <code>update()<\/code> metoduyla birden fazla objeyi tek bir sorguda g\u00fcncelleyebilirsiniz.<\/p>\n<pre><code class=\"language-python\">Kitap.objects.filter(yazar__ad='Lev').update(fiyat=35.00)<\/code><\/pre>\n<p>*   <strong>Silme:<\/strong> Bir objeyi al\u0131p <code>delete()<\/code> metoduyla silebilirsiniz.<\/p>\n<pre><code class=\"language-python\">kitap = Kitap.objects.get(id=1)\n    kitap.delete()<\/code><\/pre>\n<p>*   <strong>Toplu silme:<\/strong> <code>QuerySet<\/code> \u00fczerinde <code>delete()<\/code> metoduyla birden fazla objeyi tek bir sorguda silebilirsiniz.<\/p>\n<pre><code class=\"language-python\">Kitap.objects.filter(yazar__ad='Lev').delete()<\/code><\/pre>\n<h4>QuerySet Metotlar\u0131<\/h4>\n<p><code>filter()<\/code> veya <code>all()<\/code> gibi metotlar bir <code>QuerySet<\/code> d\u00f6nd\u00fcr\u00fcr. <code>QuerySet<\/code>&#8216;ler zincirleme metot \u00e7a\u011fr\u0131lar\u0131na izin verir ve lazy (tembel) bir yap\u0131ya sahiptir; yani veritaban\u0131 sorgusu, <code>QuerySet<\/code> \u00fczerinde ger\u00e7ekten veri istendi\u011finde (\u00f6rn. d\u00f6ng\u00fcye sokuldu\u011funda, <code>list()<\/code>&#8216;e d\u00f6n\u00fc\u015ft\u00fcr\u00fcld\u00fc\u011f\u00fcnde) y\u00fcr\u00fct\u00fcl\u00fcr.<\/p>\n<p>*   <code>order_by('alan_adi')<\/code>: Sonu\u00e7lar\u0131 belirli bir alana g\u00f6re s\u0131ralar. <code>-<\/code> \u00f6nekiyle tersten s\u0131ralan\u0131r (\u00f6rn. <code>order_by('-yayin_tarihi')<\/code>).<br \/>\n*   <code>values('alan1', 'alan2')<\/code>: <code>QuerySet<\/code>&#8216;teki her obje i\u00e7in sadece belirtilen alanlar\u0131 i\u00e7eren s\u00f6zl\u00fckler listesi d\u00f6nd\u00fcr\u00fcr.<br \/>\n*   <code>values_list('alan1', 'alan2', flat=True)<\/code>: Belirtilen alanlar\u0131n de\u011ferlerini i\u00e7eren tuple&#8217;lar listesi d\u00f6nd\u00fcr\u00fcr. <code>flat=True<\/code> ile tek bir alan se\u00e7ildi\u011finde tek de\u011ferler listesi d\u00f6nd\u00fcr\u00fcr.<br \/>\n*   <code>count()<\/code>: <code>QuerySet<\/code>&#8216;teki obje say\u0131s\u0131n\u0131 d\u00f6nd\u00fcr\u00fcr.<br \/>\n*   <code>exists()<\/code>: <code>QuerySet<\/code>&#8216;te en az bir obje olup olmad\u0131\u011f\u0131n\u0131 kontrol eder (<code>True<\/code> veya <code>False<\/code>).<br \/>\n*   <code>first()<\/code>, <code>last()<\/code>: <code>QuerySet<\/code>&#8216;teki ilk veya son objeyi d\u00f6nd\u00fcr\u00fcr (s\u0131ralama varsa).<br \/>\n*   <code>distinct()<\/code>: Tekrarlayan sat\u0131rlar\u0131 kald\u0131r\u0131r.<br \/>\n*   <code>annotate()<\/code>: Her objeye yeni bir alan eklemek i\u00e7in kullan\u0131l\u0131r (\u00f6rn. toplam, ortalama gibi agregasyonlar).<br \/>\n*   <code>aggregate()<\/code>: <code>QuerySet<\/code>&#8216;in tamam\u0131 \u00fczerinde bir agregasyon i\u015flemi yapar (\u00f6rn. t\u00fcm kitaplar\u0131n ortalama fiyat\u0131).<\/p>\n<h4>Filtreleme \u0130fadeleri (Lookups)<\/h4>\n<p><code>filter()<\/code>, <code>exclude()<\/code>, <code>get()<\/code> gibi metotlarda, alan ad\u0131n\u0131n sonuna \u00e7ift alt \u00e7izgi (<code>__<\/code>) ile eklenen ifadelerle karma\u015f\u0131k filtrelemeler yapabilirsiniz:<\/p>\n<p>*   <code>exact<\/code>: Tam e\u015fle\u015fme (varsay\u0131lan). <code>field__exact='value'<\/code><br \/>\n*   <code>iexact<\/code>: B\u00fcy\u00fck\/k\u00fc\u00e7\u00fck harf duyars\u0131z tam e\u015fle\u015fme. <code>field__iexact='value'<\/code><br \/>\n*   <code>contains<\/code>: Metin i\u00e7inde ge\u00e7iyor mu? <code>field__contains='metin'<\/code><br \/>\n*   <code>icontains<\/code>: B\u00fcy\u00fck\/k\u00fc\u00e7\u00fck harf duyars\u0131z metin i\u00e7inde ge\u00e7iyor mu?<br \/>\n*   <code>startswith<\/code>, <code>istartswith<\/code>: Belirli bir metinle ba\u015fl\u0131yor mu?<br \/>\n*   <code>endswith<\/code>, <code>iendswith<\/code>: Belirli bir metinle bitiyor mu?<br \/>\n*   <code>gt<\/code>, <code>gte<\/code>: B\u00fcy\u00fckt\u00fcr, b\u00fcy\u00fck veya e\u015fittir. <code>field__gt=10<\/code><br \/>\n*   <code>lt<\/code>, <code>lte<\/code>: K\u00fc\u00e7\u00fckt\u00fcr, k\u00fc\u00e7\u00fck veya e\u015fittir. <code>field__lt=10<\/code><br \/>\n*   <code>in<\/code>: Bir liste veya tuple i\u00e7indeki de\u011ferlerden biriyle e\u015fle\u015fiyor mu? <code>field__in=['deger1', 'deger2']<\/code><br \/>\n*   <code>range<\/code>: Belirli bir aral\u0131kta m\u0131? <code>field__range=(baslangic, bitis)<\/code><br \/>\n*   <code>isnull<\/code>: <code>NULL<\/code> mu? <code>field__isnull=True<\/code><br \/>\n*   <code>year<\/code>, <code>month<\/code>, <code>day<\/code>, <code>week_day<\/code>, <code>hour<\/code>, <code>minute<\/code>, <code>second<\/code>: Tarih\/saat alanlar\u0131n\u0131n belirli b\u00f6l\u00fcmlerine g\u00f6re filtreleme. <code>tarih_alani__year=2023<\/code><\/p>\n<p>\u0130li\u015fkili objeler \u00fczerinden filtreleme de yapabilirsiniz:<\/p>\n<pre><code class=\"language-python\"># Ad\u0131 'Lev' olan yazar\u0131n kitaplar\u0131n\u0131 bul\nkitaplar = Kitap.objects.filter(yazar__ad='Lev')\n\n<h2>Kategorisi 'Roman' olan kitaplar\u0131 bul<\/h2>\nromanlar = Kitap.objects.filter(kategoriler__ad='Roman')<\/code><\/pre>\n<h4>\u00d6zel Y\u00f6neticiler (Custom Managers)<\/h4>\n<p>Modelin varsay\u0131lan <code>objects<\/code> y\u00f6neticisi genellikle yeterli olsa da, belirli sorgular\u0131 s\u0131k s\u0131k kullan\u0131yorsan\u0131z veya modelinize \u00f6zel bir sorgu API&#8217;si eklemek istiyorsan\u0131z \u00f6zel bir y\u00f6netici olu\u015fturabilirsiniz.<\/p>\n<pre><code class=\"language-python\">class AktifKitapManager(models.Manager):\n    def get_queryset(self):\n        return super().get_queryset().filter(stok_durumu=True)\n\n    def pahali_kitaplar(self):\n        return self.get_queryset().filter(fiyat__gt=50)\n\nclass Kitap(models.Model):\n    # ... (Yukar\u0131daki Kitap modeli alanlar\u0131)\n    stok_durumu = models.BooleanField(default=True)\n\n    objects = models.Manager() # Varsay\u0131lan y\u00f6netici\n    aktif_kitaplar = AktifKitapManager() # \u00d6zel y\u00f6netici\n\n    def __str__(self):\n        return self.baslik<\/code><\/pre>\n<p>\u015eimdi, <code>Kitap.aktif_kitaplar.all()<\/code> ile sadece stokta olan kitaplar\u0131 alabilir veya <code>Kitap.aktif_kitaplar.pahali_kitaplar()<\/code> ile stokta olan pahal\u0131 kitaplar\u0131 sorgulayabilirsiniz.<\/p>\n<h3>Model Metotlar\u0131<\/h3>\n<p>Django modelleri sadece veri depolamakla kalmaz, ayn\u0131 zamanda veriler \u00fczerinde i\u015flemler ger\u00e7ekle\u015ftiren metotlar da i\u00e7erebilir. Bu metotlar, modelin davran\u0131\u015f\u0131n\u0131 \u00f6zelle\u015ftirmenize olanak tan\u0131r.<\/p>\n<h4><code>__str__<\/code> Metodu<\/h4>\n<p>Her modelde <code>__str__<\/code> metodunu tan\u0131mlamak iyi bir pratiktir. Bu metot, objenin insan taraf\u0131ndan okunabilir bir string temsilini d\u00f6nd\u00fcr\u00fcr. \u00d6zellikle Django y\u00f6netim panelinde ve objeleri konsolda yazd\u0131r\u0131rken \u00e7ok kullan\u0131\u015fl\u0131d\u0131r.<\/p>\n<pre><code class=\"language-python\">class Kitap(models.Model):\n    baslik = models.CharField(max_length=200)\n    # ...\n\n    def __str__(self):\n        return self.baslik # Kitap objesi 'Sava\u015f ve Bar\u0131\u015f' olarak g\u00f6r\u00fcn\u00fcr<\/code><\/pre>\n<h4><code>save()<\/code> Metodu<\/h4>\n<p>Objeyi veritaban\u0131na kaydetmeden \u00f6nce veya sonra \u00f6zel bir mant\u0131k \u00e7al\u0131\u015ft\u0131rmak isterseniz, <code>save()<\/code> metodunu ge\u00e7ersiz k\u0131labilirsiniz.<\/p>\n<pre><code class=\"language-python\">class Urun(models.Model):\n    ad = models.CharField(max_length=100)\n    fiyat = models.DecimalField(max_digits=10, decimal_places=2)\n    indirimli_fiyat = models.DecimalField(max_digits=10, decimal_places=2, null=True, blank=True)\n\n    def save(self, <em>args, <\/em>*kwargs):\n        # Kaydetmeden \u00f6nce indirimli fiyat\u0131 hesapla\n        if self.fiyat > 100:\n            self.indirimli_fiyat = self.fiyat * Decimal('0.9') # %10 indirim\n        else:\n            self.indirimli_fiyat = self.fiyat\n        super().save(<em>args, <\/em>*kwargs) # \u00dcst s\u0131n\u0131f\u0131n save metodunu \u00e7a\u011f\u0131r<\/code><\/pre>\n<p><strong>\u00d6nemli:<\/strong> <code>super().save(<em>args, <\/em>*kwargs)<\/code> metodunu \u00e7a\u011f\u0131rmay\u0131 unutmay\u0131n, aksi takdirde obje asl\u0131nda veritaban\u0131na kaydedilmeyecektir.<\/p>\n<h4><code>delete()<\/code> Metodu<\/h4>\n<p>Objeyi veritaban\u0131ndan silmeden \u00f6nce veya sonra \u00f6zel bir mant\u0131k \u00e7al\u0131\u015ft\u0131rmak i\u00e7in <code>delete()<\/code> metodunu ge\u00e7ersiz k\u0131labilirsiniz.<\/p>\n<pre><code class=\"language-python\">import os\nfrom django.conf import settings\n\nclass ProfilResmi(models.Model):\n    kullanici = models.OneToOneField(User, on_delete=models.CASCADE)\n    resim = models.ImageField(upload_to='profil_resimleri\/')\n\n    def delete(self, <em>args, <\/em>*kwargs):\n        # Resmi veritaban\u0131ndan silmeden \u00f6nce dosya sisteminden de sil\n        if self.resim:\n            if os.path.isfile(self.resim.path):\n                os.remove(self.resim.path)\n        super().delete(<em>args, <\/em>*kwargs)<\/code><\/pre>\n<h4><code>get_absolute_url()<\/code> Metodu<\/h4>\n<p>Bir objenin detay sayfas\u0131na y\u00f6nlendiren URL&#8217;yi d\u00f6nd\u00fcrmek i\u00e7in bu metodu kullanabilirsiniz. Bu, \u00f6zellikle \u015fablonlarda veya y\u00f6netim panelinde objeye ba\u011flant\u0131 olu\u015ftururken DRY (Don&#8217;t Repeat Yourself) prensibini uygulaman\u0131z\u0131 sa\u011flar.<\/p>\n<pre><code class=\"language-python\">from django.urls import reverse\n\nclass Kitap(models.Model):\n    # ...\n\n    def get_absolute_url(self):\n        return reverse('kitap_detay', args=[str(self.id)])<\/code><\/pre>\n<p>Ard\u0131ndan \u015fablonunuzda <code>{{ kitap.get_absolute_url }}<\/code> \u015feklinde kullanabilirsiniz.<\/p>\n<h3>Meta S\u0131n\u0131f\u0131<\/h3>\n<p>Her model s\u0131n\u0131f\u0131n\u0131n i\u00e7inde iste\u011fe ba\u011fl\u0131 olarak bir <code>class Meta:<\/code> s\u0131n\u0131f\u0131 tan\u0131mlayabilirsiniz. Bu s\u0131n\u0131f, modelin veritaban\u0131 d\u0131\u015f\u0131ndaki davran\u0131\u015f\u0131n\u0131 ve se\u00e7eneklerini belirtmek i\u00e7in kullan\u0131l\u0131r.<\/p>\n<h4><code>class Meta:<\/code> \u0130\u00e7indeki Se\u00e7enekler<\/h4>\n<p>*   <code>verbose_name = \"Tekil \u0130sim\"<\/code>: Y\u00f6netim panelinde modelin tekil ad\u0131n\u0131 belirler.<br \/>\n*   <code>verbose_name_plural = \"\u00c7o\u011ful \u0130sim\"<\/code>: Y\u00f6netim panelinde modelin \u00e7o\u011ful ad\u0131n\u0131 belirler. (Belirtilmezse Django, <code>verbose_name<\/code>&#8216;e &#8216;s&#8217; eklemeye \u00e7al\u0131\u015f\u0131r.)<br \/>\n*   <code>ordering = ['alan_adi']<\/code>: Modelden obje sorguland\u0131\u011f\u0131nda varsay\u0131lan s\u0131ralamay\u0131 belirler. <code>'-alan_adi'<\/code> ile azalan s\u0131ralama yap\u0131l\u0131r.<br \/>\n*   <code>unique_together = [['alan1', 'alan2']]<\/code>: Belirtilen alanlar\u0131n kombinasyonunun veritaban\u0131nda benzersiz olmas\u0131n\u0131 sa\u011flar. \u00d6rne\u011fin, bir kullan\u0131c\u0131n\u0131n ayn\u0131 tarihte birden fazla yorum yapmas\u0131n\u0131 engellemek i\u00e7in.<\/p>\n<pre><code class=\"language-python\">class Yorum(models.Model):\n        kullanici = models.ForeignKey(User, on_delete=models.CASCADE)\n        kitap = models.ForeignKey(Kitap, on_delete=models.CASCADE)\n        yorum_tarihi = models.DateField()\n\n        class Meta:\n            unique_together = [['kullanici', 'kitap', 'yorum_tarihi']]<\/code><\/pre>\n<p>*   <code>db_table = 'ozel_tablo_adi'<\/code>: Modelin veritaban\u0131ndaki tablo ad\u0131n\u0131 manuel olarak belirler. Varsay\u0131lan olarak Django, <code>uygulama_ad\u0131_model_ad\u0131<\/code> \u015feklinde bir isim kullan\u0131r.<br \/>\n*   <code>abstract = True<\/code>: Bu modeli soyut bir temel s\u0131n\u0131f yapar. Kendi veritaban\u0131 tablosu olmaz, ancak di\u011fer modeller ondan miras alabilir ve alanlar\u0131n\u0131 kullanabilir.<br \/>\n*   <code>app_label = 'baska_uygulama'<\/code>: Modelin ait oldu\u011fu uygulamay\u0131 belirtir. Genellikle model farkl\u0131 bir uygulaman\u0131n <code>models.py<\/code> dosyas\u0131nda tan\u0131mland\u0131\u011f\u0131nda kullan\u0131l\u0131r.<br \/>\n*   <code>indexes = [models.Index(fields=['alan_adi'])]<\/code>: Veritaban\u0131 indeksleri olu\u015fturarak sorgu performans\u0131n\u0131 art\u0131r\u0131r. \u00d6zellikle s\u0131k\u00e7a sorgulanan alanlar i\u00e7in faydal\u0131d\u0131r.<\/p>\n<h3>Veritaban\u0131 Ge\u00e7i\u015fleri (Migrations)<\/h3>\n<p>Django Modelleri, uygulaman\u0131z\u0131n veritaban\u0131 \u015femas\u0131n\u0131n evrimini y\u00f6netmek i\u00e7in g\u00fc\u00e7l\u00fc bir ge\u00e7i\u015f (migrations) sistemi sunar. Bir modelde de\u011fi\u015fiklik yapt\u0131\u011f\u0131n\u0131zda (yeni alan ekleme, alan t\u00fcr\u00fc de\u011fi\u015ftirme, model silme vb.), bu de\u011fi\u015fikliklerin veritaban\u0131na yans\u0131t\u0131lmas\u0131 gerekir.<\/p>\n<h4>Neden Ge\u00e7i\u015fler?<\/h4>\n<p>*   <strong>\u015eema Y\u00f6netimi:<\/strong> Modellerinizdeki de\u011fi\u015fiklikleri veritaban\u0131na g\u00fcvenli bir \u015fekilde uygulaman\u0131z\u0131 sa\u011flar.<br \/>\n*   <strong>Versiyon Kontrol\u00fc:<\/strong> Ge\u00e7i\u015f dosyalar\u0131 kodunuzla birlikte versiyon kontrol sistemlerinde (Git gibi) saklan\u0131r, b\u00f6ylece veritaban\u0131 \u015feman\u0131z\u0131n ge\u00e7mi\u015fini takip edebilirsiniz.<br \/>\n*   <strong>Geli\u015ftirme Ortam\u0131 Tutarl\u0131l\u0131\u011f\u0131:<\/strong> Ekip \u00fcyeleri ve farkl\u0131 ortamlar (geli\u015ftirme, test, \u00fcretim) aras\u0131nda veritaban\u0131 \u015femas\u0131n\u0131n tutarl\u0131l\u0131\u011f\u0131n\u0131 sa\u011flar.<\/p>\n<h4>Temel Komutlar<\/h4>\n<p>1.  <code>python manage.py makemigrations [uygulama_ad\u0131]<\/code>: Modellerinizde yap\u0131lan de\u011fi\u015fiklikleri (yeni model, yeni alan vb.) alg\u0131lar ve bu de\u011fi\u015fiklikleri veritaban\u0131na uygulamak i\u00e7in bir Python dosyas\u0131 (ge\u00e7i\u015f dosyas\u0131) olu\u015fturur. Uygulama ad\u0131 belirtilmezse t\u00fcm uygulamalardaki de\u011fi\u015fiklikleri kontrol eder.<\/p>\n<pre><code class=\"language-bash\">python manage.py makemigrations myapp<\/code><\/pre>\n<p>    Bu komut, <code>myapp\/migrations\/<\/code> dizininde <code>0001_initial.py<\/code>, <code>0002_add_new_field.py<\/code> gibi dosyalar olu\u015fturacakt\u0131r.<\/p>\n<p>2.  <code>python manage.py migrate [uygulama_ad\u0131] [ge\u00e7i\u015f_ad\u0131]<\/code>: Olu\u015fturulan ge\u00e7i\u015f dosyalar\u0131n\u0131 veritaban\u0131na uygular. Bu, veritaban\u0131 tablolar\u0131n\u0131 olu\u015fturur, s\u00fctunlar\u0131 ekler\/de\u011fi\u015ftirir veya siler. Ge\u00e7i\u015f ad\u0131 belirtilmezse, o uygulamadaki t\u00fcm bekleyen ge\u00e7i\u015fleri uygular.<\/p>\n<pre><code class=\"language-bash\">python manage.py migrate myapp<\/code><\/pre>\n<p>    Bu komutu \u00e7al\u0131\u015ft\u0131rd\u0131\u011f\u0131n\u0131zda, Django ge\u00e7i\u015f dosyalar\u0131n\u0131 s\u0131rayla okur ve her birindeki veritaban\u0131 i\u015flemlerini ger\u00e7ekle\u015ftirir.<\/p>\n<p>3.  <code>python manage.py showmigrations [uygulama_ad\u0131]<\/code>: Uygulamalar\u0131n\u0131zdaki ge\u00e7i\u015flerin listesini ve her birinin uygulan\u0131p uygulanmad\u0131\u011f\u0131n\u0131 g\u00f6sterir.<\/p>\n<pre><code class=\"language-bash\">python manage.py showmigrations<\/code><\/pre>\n<p>4.  <code>python manage.py sqlmigrate <uygulama_ad\u0131> <ge\u00e7i\u015f_ad\u0131><\/code>: Belirli bir ge\u00e7i\u015f dosyas\u0131 i\u00e7in \u00e7al\u0131\u015ft\u0131r\u0131lacak ham SQL komutlar\u0131n\u0131 g\u00f6sterir. Bu, ge\u00e7i\u015fin veritaban\u0131 \u00fczerinde ne gibi bir etki yarataca\u011f\u0131n\u0131 anlamak i\u00e7in faydal\u0131d\u0131r.<\/p>\n<pre><code class=\"language-bash\">python manage.py sqlmigrate myapp 0001_initial<\/code><\/pre>\n<p>Ge\u00e7i\u015fler, Django geli\u015ftirme i\u015f ak\u0131\u015f\u0131n\u0131n vazge\u00e7ilmez bir par\u00e7as\u0131d\u0131r ve model de\u011fi\u015fikliklerini y\u00f6netmek i\u00e7in g\u00fcvenilir bir mekanizma sunar.<\/p>\n<h3>Geli\u015fmi\u015f Konulara K\u0131sa Bak\u0131\u015f<\/h3>\n<p>Django Modelleri, temel CRUD i\u015flemlerinin ve ili\u015fkilerin \u00f6tesinde, daha karma\u015f\u0131k senaryolar\u0131 ele almak i\u00e7in \u00e7e\u015fitli geli\u015fmi\u015f \u00f6zellikler sunar.<\/p>\n<h4>Proxy Modeller<\/h4>\n<p>Proxy modeller, mevcut bir modelin veritaban\u0131 \u015femas\u0131n\u0131 de\u011fi\u015ftirmeden ona yeni davran\u0131\u015flar (metotlar, y\u00f6neticiler) eklemenizi sa\u011flar. Temel modelle ayn\u0131 veritaban\u0131 tablosunu kullan\u0131r, sadece Python seviyesinde farkl\u0131 bir aray\u00fcz sunar.<\/p>\n<pre><code class=\"language-python\">class Siparis(models.Model):\n    durum = models.CharField(max_length=20, default='beklemede')\n    # ...\n\nclass AktifSiparis(Siparis):\n    class Meta:\n        proxy = True\n        ordering = ['-id']\n\n    def iptal_et(self):\n        self.durum = 'iptal edildi'\n        self.save()\n\n<h2>\u015eimdi AktifSiparis.objects.all() \u00e7a\u011fr\u0131s\u0131 Siparis tablosundan veri al\u0131r,<\/h2>\n<h2>ancak iptal_et metodu sadece AktifSiparis objelerinde mevcuttur.<\/code><\/pre>\n<\/h2>\n<h4>\u00c7oklu Tablo Kal\u0131t\u0131m\u0131 (Multi-table Inheritance)<\/h4>\n<p>Python&#8217;daki normal kal\u0131t\u0131m gibi \u00e7al\u0131\u015f\u0131r, ancak her model kendi veritaban\u0131 tablosuna sahiptir. Alt model, \u00fcst modelin birincil anahtar\u0131na bir <code>OneToOneField<\/code> ile ba\u011flan\u0131r. Bu, verileri farkl\u0131 tablolara b\u00f6lmek ve ortak alanlar\u0131 \u00fcst s\u0131n\u0131fta tan\u0131mlamak i\u00e7in kullan\u0131\u015fl\u0131d\u0131r.<\/p>\n<pre><code class=\"language-python\">class TemelUrun(models.Model):\n    ad = models.CharField(max_length=100)\n    fiyat = models.DecimalField(max_digits=10, decimal_places=2)\n\nclass KitapUrun(TemelUrun):\n    isbn = models.CharField(max_length=13)\n    yazar = models.CharField(max_length=100)\n\nclass ElektronikUrun(TemelUrun):\n    marka = models.CharField(max_length=50)\n    garanti_suresi = models.IntegerField()<\/code><\/pre>\n<p>Bu durumda, <code>KitapUrun<\/code> ve <code>ElektronikUrun<\/code> modelleri <code>TemelUrun<\/code>&#8216;den miras al\u0131r ve her biri kendi \u00f6zel alanlar\u0131na sahip ayr\u0131 birer tablo olarak veritaban\u0131nda yer al\u0131r. <code>TemelUrun<\/code>&#8216;\u00fcn alanlar\u0131 da kendi tablosunda bulunur ve alt modeller bu tabloya birincil anahtar arac\u0131l\u0131\u011f\u0131yla ba\u011fl\u0131d\u0131r.<\/p>\n<h4>Soyut Temel S\u0131n\u0131flar (Abstract Base Classes)<\/h4>\n<p>\u00c7oklu tablo kal\u0131t\u0131m\u0131n\u0131n aksine, soyut temel s\u0131n\u0131flar kendi ba\u015flar\u0131na bir veritaban\u0131 tablosu olu\u015fturmazlar. Bunun yerine, ortak alanlar\u0131 ve metotlar\u0131 tan\u0131mlamak ve di\u011fer modellere miras vermek i\u00e7in kullan\u0131l\u0131rlar. Miras alan her model, soyut temel s\u0131n\u0131ftaki alanlar\u0131 kendi veritaban\u0131 tablosunda olu\u015fturur.<\/p>\n<pre><code class=\"language-python\">class ZamanDamgaliModel(models.Model):\n    olusturma_tarihi = models.DateTimeField(auto_now_add=True)\n    guncelleme_tarihi = models.DateTimeField(auto_now=True)\n\n    class Meta:\n        abstract = True\n        ordering = ['-olusturma_tarihi']\n\nclass Yazi(ZamanDamgaliModel):\n    baslik = models.CharField(max_length=200)\n    icerik = models.TextField()\n\nclass Yorum(ZamanDamgaliModel):\n    yazi = models.ForeignKey(Yazi, on_delete=models.CASCADE)\n    metin = models.TextField()<\/code><\/pre>\n<p><code>ZamanDamgaliModel<\/code> soyut oldu\u011fu i\u00e7in kendi tablosu yoktur. Ancak <code>Yazi<\/code> ve <code>Yorum<\/code> modelleri, <code>olusturma_tarihi<\/code> ve <code>guncelleme_tarihi<\/code> alanlar\u0131na sahip olacakt\u0131r.<\/p>\n<h4>Raw SQL ve Veritaban\u0131 Fonksiyonlar\u0131<\/h4>\n<p>Nadiren de olsa, Django ORM&#8217;nin sundu\u011fu ara\u00e7lar\u0131n yetersiz kald\u0131\u011f\u0131 durumlar olabilir. Bu durumlarda, ham SQL sorgular\u0131 yazabilir veya Django&#8217;nun <code>F()<\/code> ve <code>Q()<\/code> objeleri gibi daha geli\u015fmi\u015f ORM \u00f6zelliklerini kullanabilirsiniz.<\/p>\n<p>*   <strong><code>F()<\/code> objeleri:<\/strong> Bir modelin alanlar\u0131 aras\u0131ndaki de\u011ferleri do\u011frudan veritaban\u0131 seviyesinde kar\u015f\u0131la\u015ft\u0131rmak veya g\u00fcncellemek i\u00e7in kullan\u0131l\u0131r. Bu, veritaban\u0131ndan veri \u00e7ekip Python&#8217;da i\u015flem yap\u0131p geri kaydetmek yerine, tek bir veritaban\u0131 sorgusuyla i\u015flemi halletmenizi sa\u011flar.<\/p>\n<pre><code class=\"language-python\">from django.db.models import F\n    # T\u00fcm \u00fcr\u00fcnlerin fiyat\u0131n\u0131 %10 art\u0131r\n    Urun.objects.update(fiyat=F('fiyat') * 1.1)<\/code><\/pre>\n<p>*   <strong><code>Q()<\/code> objeleri:<\/strong> Karma\u015f\u0131k <code>AND<\/code> ve <code>OR<\/code> ko\u015fullar\u0131yla sorgular olu\u015fturmak i\u00e7in kullan\u0131l\u0131r.<\/p>\n<pre><code class=\"language-python\">from django.db.models import Q\n    # Yazar ad\u0131 'Lev' VEYA soyad\u0131 'Tolstoy' olan kitaplar\u0131 bul\n    kitaplar = Kitap.objects.filter(Q(yazar__ad='Lev') | Q(yazar__soyad='Tolstoy'))\n\n    # Yazar ad\u0131 'Lev' VE yay\u0131m tarihi 2000'den b\u00fcy\u00fck olan kitaplar\u0131 bul\n    kitaplar = Kitap.objects.filter(Q(yazar__ad='Lev') & Q(yayin_tarihi__year__gt=2000))<\/code><\/pre>\n<p>*   <strong><code>raw()<\/code> metodu:<\/strong> Ham SQL sorgular\u0131 \u00e7al\u0131\u015ft\u0131rmak ve sonu\u00e7lar\u0131 model objeleri olarak almak i\u00e7in kullan\u0131l\u0131r.<\/p>\n<pre><code class=\"language-python\">for p in Kitap.objects.raw('SELECT * FROM myapp_kitap WHERE yazar_id = %s', [1]):\n        print(p.baslik)<\/code><\/pre>\n<p>*   <strong><code>django.db.connection.cursor()<\/code>:<\/strong> Tamamen ham SQL sorgular\u0131 \u00e7al\u0131\u015ft\u0131rmak ve sonu\u00e7lar\u0131 do\u011frudan veritaban\u0131 imlecinden almak i\u00e7in kullan\u0131l\u0131r. Bu, en d\u00fc\u015f\u00fck seviyeli yakla\u015f\u0131md\u0131r ve genellikle \u00f6zel raporlama veya performans kritik i\u015flemler i\u00e7in tercih edilir.<\/p>\n<h3>Sonu\u00e7<\/h3>\n<p>Django Modelleri, Django \u00e7at\u0131s\u0131n\u0131n kalbinde yer al\u0131r ve web uygulamalar\u0131n\u0131z\u0131n veri katman\u0131n\u0131 olu\u015fturur. ORM&#8217;nin sa\u011flad\u0131\u011f\u0131 soyutlama sayesinde, veritaban\u0131 i\u015flemleri Pythonic bir \u015fekilde y\u00fcr\u00fct\u00fcl\u00fcr, geli\u015ftirme s\u00fcreci h\u0131zlan\u0131r ve kodun bak\u0131m\u0131 kolayla\u015f\u0131r. Bu makalede, temel model tan\u0131mlamalar\u0131ndan alan t\u00fcrlerine, karma\u015f\u0131k ili\u015fkilere, g\u00fc\u00e7l\u00fc sorgu setlerine ve geli\u015fmi\u015f model \u00f6zelliklerine kadar geni\u015f bir yelpazeyi ele ald\u0131k.<\/p>\n<p>Django Modelleri, uygulaman\u0131z\u0131n verilerini yap\u0131land\u0131rma, sorgulama ve y\u00f6netme konusunda size inan\u0131lmaz bir esneklik ve g\u00fc\u00e7 sunar. Bu bilgileri \u00f6z\u00fcmseyerek ve pratik yaparak, kendi Django projelerinizde sa\u011flam, \u00f6l\u00e7eklenebilir ve bak\u0131m\u0131 kolay veri modelleri olu\u015fturmak i\u00e7in sa\u011flam bir temel atm\u0131\u015f olacaks\u0131n\u0131z. Unutmay\u0131n, iyi tasarlanm\u0131\u015f bir veri modeli, ba\u015far\u0131l\u0131 bir uygulaman\u0131n temelidir.<\/body><\/p>\n","protected":false},"excerpt":{"rendered":"Jumping Into Django Models: Veri Modellemenin Kalbine Bir Dal\u0131\u015f\nDjango, h\u0131zl\u0131 ve verimli web uygulamalar\u0131 geli\u015ftirmek i\u00e7in tasarlanm\u0131\u015f, y\u00fck","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"csco_page_header_type":"","csco_page_load_nextpost":"","csco_page_subscribe_form":"","csco_page_contact_form":"","footnotes":""},"categories":[1],"tags":[],"class_list":{"0":"post-35344","1":"post","2":"type-post","3":"status-publish","4":"format-standard","6":"category-genel","7":"cs-entry","8":"cs-video-wrap"},"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v20.5 (Yoast SEO v25.3.1) - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>Jumping Into Django Models: Veri Modellemenin Kalbine Bir Dal\u0131\u015f - Kodlar\u0131n Gizemli D\u00fcnyas\u0131<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/fatihsoysal.com\/blog\/jumping-into-django-models-veri-modellemenin-kalbine-bir-dalis\/\" \/>\n<meta property=\"og:locale\" content=\"tr_TR\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Jumping Into Django Models: Veri Modellemenin Kalbine Bir Dal\u0131\u015f\" \/>\n<meta property=\"og:description\" content=\"Jumping Into Django Models: Veri Modellemenin Kalbine Bir Dal\u0131\u015f Django, h\u0131zl\u0131 ve verimli web uygulamalar\u0131 geli\u015ftirmek i\u00e7in tasarlanm\u0131\u015f, y\u00fck\" \/>\n<meta property=\"og:url\" content=\"https:\/\/fatihsoysal.com\/blog\/jumping-into-django-models-veri-modellemenin-kalbine-bir-dalis\/\" \/>\n<meta property=\"og:site_name\" content=\"Kodlar\u0131n Gizemli D\u00fcnyas\u0131\" \/>\n<meta property=\"article:published_time\" content=\"2025-11-28T12:41:05+00:00\" \/>\n<meta name=\"author\" content=\"Fatih Soysal\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Yazan:\" \/>\n\t<meta name=\"twitter:data1\" content=\"Fatih Soysal\" \/>\n\t<meta name=\"twitter:label2\" content=\"Tahmini okuma s\u00fcresi\" \/>\n\t<meta name=\"twitter:data2\" content=\"24 dakika\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/jumping-into-django-models-veri-modellemenin-kalbine-bir-dalis\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/jumping-into-django-models-veri-modellemenin-kalbine-bir-dalis\/\"},\"author\":{\"name\":\"Fatih Soysal\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"headline\":\"Jumping Into Django Models: Veri Modellemenin Kalbine Bir Dal\u0131\u015f\",\"datePublished\":\"2025-11-28T12:41:05+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/jumping-into-django-models-veri-modellemenin-kalbine-bir-dalis\/\"},\"wordCount\":3369,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"inLanguage\":\"tr\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/fatihsoysal.com\/blog\/jumping-into-django-models-veri-modellemenin-kalbine-bir-dalis\/#respond\"]}],\"copyrightYear\":\"2025\",\"copyrightHolder\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#organization\"}},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/jumping-into-django-models-veri-modellemenin-kalbine-bir-dalis\/\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/jumping-into-django-models-veri-modellemenin-kalbine-bir-dalis\/\",\"name\":\"Jumping Into Django Models: Veri Modellemenin Kalbine Bir Dal\u0131\u015f - Kodlar\u0131n Gizemli D\u00fcnyas\u0131\",\"isPartOf\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#website\"},\"datePublished\":\"2025-11-28T12:41:05+00:00\",\"breadcrumb\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/jumping-into-django-models-veri-modellemenin-kalbine-bir-dalis\/#breadcrumb\"},\"inLanguage\":\"tr\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/fatihsoysal.com\/blog\/jumping-into-django-models-veri-modellemenin-kalbine-bir-dalis\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/jumping-into-django-models-veri-modellemenin-kalbine-bir-dalis\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Anasayfa\",\"item\":\"https:\/\/fatihsoysal.com\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Jumping Into Django Models: Veri Modellemenin Kalbine Bir Dal\u0131\u015f\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#website\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/\",\"name\":\"Fatihsoysal.com\",\"description\":\"Blog - Yaz\u0131l\u0131m D\u00fcnyas\u0131 Tecr\u00fcbelerim\",\"publisher\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/fatihsoysal.com\/blog\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"tr\"},{\"@type\":[\"Person\",\"Organization\"],\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\",\"name\":\"Fatih Soysal\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"tr\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/wp-content\/uploads\/2024\/04\/cropped-replicate-prediction-3kgg1hgjn5rgp0cf0p5tr0jw7w-1.png\",\"contentUrl\":\"https:\/\/fatihsoysal.com\/blog\/wp-content\/uploads\/2024\/04\/cropped-replicate-prediction-3kgg1hgjn5rgp0cf0p5tr0jw7w-1.png\",\"width\":512,\"height\":512,\"caption\":\"Fatih Soysal\"},\"logo\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/image\/\"},\"description\":\"Kullan\u0131m ve kodlama m\u00fckemmeliyetini odak alan uygulamalar olu\u015fturma deneyimine sahip, profesyonel olarak 15+ y\u0131l \u00fczeri deneyime sahip bir yaz\u0131l\u0131m m\u00fchendisi.\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/author\/fatihsoysal\/\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"Jumping Into Django Models: Veri Modellemenin Kalbine Bir Dal\u0131\u015f - Kodlar\u0131n Gizemli D\u00fcnyas\u0131","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/fatihsoysal.com\/blog\/jumping-into-django-models-veri-modellemenin-kalbine-bir-dalis\/","og_locale":"tr_TR","og_type":"article","og_title":"Jumping Into Django Models: Veri Modellemenin Kalbine Bir Dal\u0131\u015f","og_description":"Jumping Into Django Models: Veri Modellemenin Kalbine Bir Dal\u0131\u015f Django, h\u0131zl\u0131 ve verimli web uygulamalar\u0131 geli\u015ftirmek i\u00e7in tasarlanm\u0131\u015f, y\u00fck","og_url":"https:\/\/fatihsoysal.com\/blog\/jumping-into-django-models-veri-modellemenin-kalbine-bir-dalis\/","og_site_name":"Kodlar\u0131n Gizemli D\u00fcnyas\u0131","article_published_time":"2025-11-28T12:41:05+00:00","author":"Fatih Soysal","twitter_card":"summary_large_image","twitter_misc":{"Yazan:":"Fatih Soysal","Tahmini okuma s\u00fcresi":"24 dakika"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/fatihsoysal.com\/blog\/jumping-into-django-models-veri-modellemenin-kalbine-bir-dalis\/#article","isPartOf":{"@id":"https:\/\/fatihsoysal.com\/blog\/jumping-into-django-models-veri-modellemenin-kalbine-bir-dalis\/"},"author":{"name":"Fatih Soysal","@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"headline":"Jumping Into Django Models: Veri Modellemenin Kalbine Bir Dal\u0131\u015f","datePublished":"2025-11-28T12:41:05+00:00","mainEntityOfPage":{"@id":"https:\/\/fatihsoysal.com\/blog\/jumping-into-django-models-veri-modellemenin-kalbine-bir-dalis\/"},"wordCount":3369,"commentCount":0,"publisher":{"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"inLanguage":"tr","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/fatihsoysal.com\/blog\/jumping-into-django-models-veri-modellemenin-kalbine-bir-dalis\/#respond"]}],"copyrightYear":"2025","copyrightHolder":{"@id":"https:\/\/fatihsoysal.com\/blog\/#organization"}},{"@type":"WebPage","@id":"https:\/\/fatihsoysal.com\/blog\/jumping-into-django-models-veri-modellemenin-kalbine-bir-dalis\/","url":"https:\/\/fatihsoysal.com\/blog\/jumping-into-django-models-veri-modellemenin-kalbine-bir-dalis\/","name":"Jumping Into Django Models: Veri Modellemenin Kalbine Bir Dal\u0131\u015f - Kodlar\u0131n Gizemli D\u00fcnyas\u0131","isPartOf":{"@id":"https:\/\/fatihsoysal.com\/blog\/#website"},"datePublished":"2025-11-28T12:41:05+00:00","breadcrumb":{"@id":"https:\/\/fatihsoysal.com\/blog\/jumping-into-django-models-veri-modellemenin-kalbine-bir-dalis\/#breadcrumb"},"inLanguage":"tr","potentialAction":[{"@type":"ReadAction","target":["https:\/\/fatihsoysal.com\/blog\/jumping-into-django-models-veri-modellemenin-kalbine-bir-dalis\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/fatihsoysal.com\/blog\/jumping-into-django-models-veri-modellemenin-kalbine-bir-dalis\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Anasayfa","item":"https:\/\/fatihsoysal.com\/blog\/"},{"@type":"ListItem","position":2,"name":"Jumping Into Django Models: Veri Modellemenin Kalbine Bir Dal\u0131\u015f"}]},{"@type":"WebSite","@id":"https:\/\/fatihsoysal.com\/blog\/#website","url":"https:\/\/fatihsoysal.com\/blog\/","name":"Fatihsoysal.com","description":"Blog - Yaz\u0131l\u0131m D\u00fcnyas\u0131 Tecr\u00fcbelerim","publisher":{"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/fatihsoysal.com\/blog\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"tr"},{"@type":["Person","Organization"],"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1","name":"Fatih Soysal","image":{"@type":"ImageObject","inLanguage":"tr","@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/image\/","url":"https:\/\/fatihsoysal.com\/blog\/wp-content\/uploads\/2024\/04\/cropped-replicate-prediction-3kgg1hgjn5rgp0cf0p5tr0jw7w-1.png","contentUrl":"https:\/\/fatihsoysal.com\/blog\/wp-content\/uploads\/2024\/04\/cropped-replicate-prediction-3kgg1hgjn5rgp0cf0p5tr0jw7w-1.png","width":512,"height":512,"caption":"Fatih Soysal"},"logo":{"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/image\/"},"description":"Kullan\u0131m ve kodlama m\u00fckemmeliyetini odak alan uygulamalar olu\u015fturma deneyimine sahip, profesyonel olarak 15+ y\u0131l \u00fczeri deneyime sahip bir yaz\u0131l\u0131m m\u00fchendisi.","url":"https:\/\/fatihsoysal.com\/blog\/author\/fatihsoysal\/"}]}},"yoast_meta":{"yoast_wpseo_title":"","yoast_wpseo_metadesc":"","yoast_wpseo_canonical":""},"amp_enabled":true,"_links":{"self":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts\/35344","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/comments?post=35344"}],"version-history":[{"count":1,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts\/35344\/revisions"}],"predecessor-version":[{"id":35345,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts\/35344\/revisions\/35345"}],"wp:attachment":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/media?parent=35344"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/categories?post=35344"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/tags?post=35344"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}