子类别Django商店

时间:2017-01-30 15:36:10

标签: python django python-3.x django-models

我有两类男人和女人,我想创建子类别并将其连接到产品中 这是我的models.py

class Category(models.Model):
    name = models.CharField(max_length=200,
                            db_index=True)
    slug = models.SlugField(max_length=200,
                            db_index=True,
                            unique=True)

    class Meta:
        ordering = ('name',)
        verbose_name = 'category'
        verbose_name_plural = 'categories'

    def __str__(self):
        return self.name


class Product(models.Model):
    category = models.ForeignKey(Category,
                                 related_name='products')
    name = models.CharField(max_length=200, db_index=True)
    slug = models.SlugField(max_length=200, db_index=True)
    image = models.ImageField(upload_to='products/%Y/%m/%d',
                              blank=True)
    description = models.TextField(blank=True)
    price = models.DecimalField(max_digits=10, decimal_places=2)
    stock = models.PositiveIntegerField()
    available = models.BooleanField(default=True)
    created = models.DateField(auto_now_add=True)
    update = models.DateField(auto_now=True)

    class Meta:
        ordering = ('name',)
        index_together = (('id', 'slug'),)

    def __str__(self):
        return self.name

我想我可以创建这个类

class Subcategory 
    name = models.CharField(max_length=200,
                            db_index=True)
    slug = models.SlugField(max_length=200,
                            db_index=True,
                            unique=True)
   category = models.ForeignKey(Category)

并将其添加到Product class

 subcategory = models.ForeignKey(Subcategory) 

但我不认为这是一个好方法

2 个答案:

答案 0 :(得分:1)

您可以将parent_category字段添加到Category模型中,该模型是自身的外键:

parent_category=models.ForeignKey('self', on_delete=models.CASCADE, null=True)

然后,您可以将任何具有parent_category的类别视为子类别。

如果您希望产品位于多个(子)类别中,则必须在Product Model上将类别字段设为ManyToMany字段而不是外键。如果产品最多只能包含一个类别且最多只有一个子类别,那么您可以在产品型号上保留一个类别和子类别字段,但必须为每个类别设置related_name

答案 1 :(得分:0)

您可以使用此字段(如voodoo-burger所述)从Category对象创建邻接树,我还添加了blank = True,以便能够在Django admin中创建根类别。

parent=models.ForeignKey('self', on_delete=models.CASCADE, null=True, blank=True)

接下来,如果您有许多类别并希望对树结构进行查询,则需要查看MPTT(https://github.com/django-mptt/django-mptt)。