21 Ağustos 2008 Perşembe

Django'da Model Tanımlarken Gerekebilecek İpucu

Aşağıdaki gibi örnek bir model kodu oluşturmam gerekliydi. Model yapısından da anlaşılacağa üzere User'lar kendi Tag'lerini yaratabilecek (her tag'in bir creator'ı olacak) ve aynı zamanda User'lar bu Tag'leri kendilerine ekleyebilecekler. Buraya kadar gayet basit, fakat sorun model dosyasını oluşturmaya başlayınca çıkıyor ortaya.

Deneme yanılma ile problemleri aşmaya çalışıyordum.

models.py


class User(models.Model):
  username = models.CharField(max_length=100)
  fav_tags = models.ManyToManyField(Tag)
  name = models.CharField(max_length=100)
  surname = models.CharField(max_length=100)
  password = models.CharField(max_length=100)

class Tag(models.Model):
  creator = models.ForeignKey(User)
  name = models.CharField(max_length=500)


Bunda fav_tags = models.ManyToManyField(Tag) satırındaki Tag icin tanımlanamıyor hatası verdi. Kod satır satır işlendiğinden Tag'in bir class olduğundan habersiz bu arkadaş. Aradaki relation ManyToMany olduğundan ve bu ilişki iki class içerisinden birinde yazılacağından fav_tags = models.ManyToManyField(Tag) satırını kaldırdım ve dosya şu hale geldi.


class User(models.Model):
  username = models.CharField(max_length=100)
  name = models.CharField(max_length=100)
  surname = models.CharField(max_length=100)
  password = models.CharField(max_length=100)

class Tag(models.Model):
  creator = models.ForeignKey(User)
  users = models.ManyToManyField(User)
  name = models.CharField(max_length=500)


Bu defa da Tag sınıfının altında iki adet User ile ilişki tanımlandığından hata verdi. Önceki yöntem buna göre daha iyiydi, bir şekilde Tag'in class olduğunu söyleyebilirsem, sorun hallolacaktı. Python'da Forward Declaration nasıl yapılıyor diye baktım ve sonuç alamadım.

Ben de en üst satıra


class Tag(models.Model):
  pass


ekledim ve syncdb dediğim vakit database tabloları oluşturuldu, fakat Tag sınıfı için oluşan tabloda sadece id alt alanı vardı ve sadece bu en üste eklediğim satır için tablo oluşturulmuştu, herhangi bir alt alanı olmadığından sadece id alt alanı eklenmişti.

Bir ara pes etmeye yakınken, irc'den django kanalında sorarsam belki sonuç alabilirim dedim ve hakikaten çok basit bir çözümü olduğunu öğrendim.


class User(models.Model):
  username = models.CharField(max_length=100)
  fav_tags = models.ManyToManyField("Tag")
  name = models.CharField(max_length=100)
  surname = models.CharField(max_length=100)
  password = models.CharField(max_length=100)

class Tag(models.Model):
  creator = models.ForeignKey(User)
  name = models.CharField(max_length=500)


fav_tags = models.ManyToManyField("Tag") satırındaki Tag'i String olarak yazdığım vakit hiç sorunsuz bu işi halledebiliyormuşum. En azından çok da fazla kafayı yemeden sorun hallolduğu için mutluyum.

Bazen gereğinden fazla kompleks düşünmemek gerek... ! Mesajımı da veririm arkadaş :-m