【问题标题】:Django categories, sub-categories and sub-sub-categoriesDjango类别、子类别和子子类别
【发布时间】:2012-02-29 01:01:32
【问题描述】:

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

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

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

我希望我的网址是类别/子类别/子子类别

我正在考虑如何实现这个,但我不确定,因为我的 url 模式匹配看起来像这样:

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

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

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

【问题讨论】:

    标签: django


    【解决方案1】:

    无限关卡呢?在 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)
        ...
    

    别忘了在 Category.Meta 中添加unique_together = ('slug', 'parent',),否则你就完蛋了。

    [更新]

    我可以只用 category_slugs[-1] 查询数据库,如果获得的类别没有子类别,我们知道它是叶类别,否则,我们知道它有子类别并显示它们? ——亚历克斯布兰德

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

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

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

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

    【讨论】:

    • 我可以用 category_slugs[-1] 查询数据库,如果获得的类别没有子类别,我们知道它是叶类别,否则,我们知道它有子类别并显示它们?跨度>
    • 你完全正确。我没有想过在不同的类别中有相同的子类别名称的可能性。
    • 建议的解决方案中更新的类别列表在哪里?
    • @PauloScardine,感谢您的回答!不过,我不得不和 Alex 一起,categories = [] 在哪里得到更新?谢谢!
    • @MickyHulse:只需将循环中找到的每个类别附加到类别数组即可。我已经用这样的声明更新了答案(但从未真正测试过,如果它有效,请告诉我)。
    猜你喜欢
    • 2010-11-28
    • 2012-10-14
    • 1970-01-01
    • 2017-10-28
    • 2011-01-04
    • 2015-04-05
    • 2019-01-17
    相关资源
    最近更新 更多