Djangoroidの奮闘記

python,django,angularJS1~三十路過ぎたプログラマーの奮闘記

Django e-commerce part25 Product Categories

Product Categories のmodelをつくる

class Product(models.Model):
    title = models.CharField(max_length=120)
    description = models.TextField(blank=True, null=True)
    price = models.DecimalField(decimal_places=0, max_digits=20)
    active = models.BooleanField(default=True)
    categories = models.ManyToManyField('Category')
    default = models.ForeignKey('Category')

    objects = ProductManager()

    def __str__(self):
        return self.title

    def get_absolute_url(self):
        return reverse("product_detail", kwargs={"pk": self.pk})

...

class Category(models.Model):
    title = models.CharField(max_length=120, unique=True)
    slug = models.SlugField(unique=True)
    description = models.TextField(null=True, blank=True)
    active = models.BooleanField(default=True)
    timestamp = models.DateTimeField(auto_now_add=True, auto_now=False)

    def __str__(self):
        return self.title
...
  • category のmodelを作成する。
  • Productに、categoriesと、defaultのcategory のfieldsを作成する。
  • ここで注意するのは、foreginkey('Category') となっている点に注意。これは、多対一のリレーションを張るために、必要な処理。詳細は以下のとおり。

モデルフィールドリファレンス — Django 1.4 documentation

  • なので、上記のコードにリレーションからの参照用のrelation_nameを明示する必要あり。これを反映させると以下のようなコードになる。
class Product(models.Model):
    title = models.CharField(max_length=120)
    description = models.TextField(blank=True, null=True)
    price = models.DecimalField(decimal_places=0, max_digits=20)
    active = models.BooleanField(default=True)
    categories = models.ManyToManyField('Category', blank=True)
    default = models.ForeignKey('Category', related_name='default_category', null=True, blank=True)