Django类别,子类别和子子类别

时间:2012-02-29 01:01:33

标签: django

我有一个简单的类别模型:

class Category(models.Model):
    name = models.CharField(max_length=200)
    slug = models.SlugField()
    parent = models.ForeignKey('self', blank = True, null = True, related_name="children")

起初,我的数据似乎只需要类别和子类别,但我意识到在某些情况下我仍然希望进行子分类。

我希望我的网址是category / subcategory / sub-subcategory

我在考虑如何实现这个,但我不确定,因为我的网址模式匹配如下:

url(r'^business/(?P<parent>[-\w]+)/(?P<category_name>[-\w]+)$', 'directory.views.show_category'),

基本上只允许单个子类别,因为我的view方法接受这两个参数。

处理此问题的最佳方法是什么?

1 个答案:

答案 0 :(得分:14)

无限级别怎么样?在urls.py:

url(r'^business/(?P<hierarchy>.+)/', 'directory.views.show_category')

在目录/ views.py:

def show_category(request, hierarchy):
    category_slugs = hierarchy.split('/')
    categories = []
    for slug in category_slugs:
        if not categories:
            parent = None
        else:
            parent = categories[-1]
        category = get_object_or_404(Category, slug=slug, parent=parent)
        categories.append(category)
    ...

别忘了将unique_together = ('slug', 'parent',)添加到Category.Meta,否则你注定要失败。

[更新]

  

我可以用category_slugs [-1]查询数据库,如果获得的类别没有子节点,我们知道它是一个叶子类别,否则,我们知道它有子类别并且我们显示它们? - alexBrand

@alexBrand:考虑以下假设网址:

/business/manufacture/frozen/pizza/
/business/restaurant/italian/pizza/
/business/delivery-only/italian/pizza/
/business/sports/eating-contest/pizza/

如果您认为这种情况是可能的,那么IMHO更简单的测试(没有整个层次结构)是不够的。

您对提议的解决方案有什么真正的顾虑?在循环结束时,变量类别将保留正确的category_slugs[-1],您将在categories中使用整个层次结构。不要担心性能,我最好的建议是:在分析之前不要尝试优化优雅的解决方案(你会感到惊讶)。