我有一个简单的类别模型:
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方法接受这两个参数。
处理此问题的最佳方法是什么?
答案 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
中使用整个层次结构。不要担心性能,我最好的建议是:在分析之前不要尝试优化优雅的解决方案(你会感到惊讶)。