如何创建类别和子类别

2024-04-26 06:58:09 发布

您现在位置:Python中文网/ 问答频道 /正文

这是我的项目模型,如何创建一个类别和子类别,如:男装衬衫和女装衬衫。你知道吗

class Item(models.Model):
    title = models.CharField(max_length=250)
    company_name = models.CharField(max_length=50, blank=True)
    product_you_may_like = models.ForeignKey(ProductYouMayLike, null=True, blank=True, 
    on_delete=models.CASCADE)
    image = models.ImageField(null=True)
    price = models.IntegerField()
    old_price = models.IntegerField(null=True, blank=True)
    shipping_amount = models.IntegerField()
    percentage_off = models.IntegerField(null=True, blank=True)
    description = models.TextField(null=True, blank=True)
    specification = models.TextField(null=True, blank=True)
    product_type = models.CharField(max_length=20, choices=PRODUCT_TYPE, null=True, blank=True)
    slug = AutoSlugField(populate_from='title', unique=True)
    timestamp = models.DateTimeField(auto_now_add=True)
    active = models.BooleanField(default=True)

    class Meta:
        ordering = ['-timestamp']
        db_table = 'items'
        verbose_name_plural = 'Items'

    def __str__(self):
        return self.title

Tags: nametruetitlemodelsproduct类别nulllength
3条回答

我可以通过添加一个模型类别和一个foreignkey到Item模型来解决这个问题。例如

class Item(models.Model):
    category = models.ForeignKey(Category,     null=True,blank=True,
                             on_delete=models.CASCADE)

class Category(models.Model):
    name = models.CharField(max_length=250)  

在模型中,在类别中添加男式衬衫,然后保存。你知道吗

在视图.py地址:

def template(request):
    category = Category.objects.filter(name="men_shirt")
    context = { 'category':category } 
    return render(request, "template.html", context) 

在模板中:

{% for category in category %} 
{% for item in category.item.all %}
 <h1>This will display all content in item by the name you filtered in views.py </h1>
{% endfor %} 
{% endfor %} 

您可以使用django-mptt来创建一个类别树,然后在项目模型中拥有此模型的外键。你知道吗

class Category(MPTTModel):
    name=models.CharField(max_length=75,null=False,blank=False, unique=True)
    parent=TreeForeignKey('self', null=True, blank=True, related_name='children', db_index=True, on_delete=models.CASCADE)

我不知道你是怎么写你的MenShirtCategory,但是这个名字让我觉得你把类和实例弄混了。你知道吗

通常,您可能会有一个Category模型(或者ItemCategory,如果这些分类是特定于Item)的,那么可以这样写:

class Category(models.Model):
    name = models.CharField(max_length=..., ...)  # men shirts will be the name
    parent = models.ForeignKey('self', null=True, blank=True,
                               on_delete=...,
                               related_name='children')

然后将其连接到项目模型:

class Item(models.Model):
    category = models.ForeignKey(Category, null=True, blank=True,
                                 on_delete=models.CASCADE)

通过在Category模型的parent字段中使用'self',可以实现嵌套类别的概念。你知道吗

当然,您可能需要手动确保不创建循环(B的子级A的子级),因为数据库(然后是模型)不能为您创建循环。执行此操作时,您可能还需要检查类别不能是它自己的父级。你知道吗

相关问题 更多 >