2012-02-29 144 views
4

我有一個簡單的分類模型: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") 

起初,我的數據似乎只需要類別和子類別,但我意識到,有一些情況下,我仍然希望子分類。

我想我的網址是類別/子/子子類別

我在思考如何實現這一點,但我不知道,因爲我的URL模式匹配看起來是這樣的:

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

基本上只允許一個子類別,因爲我的view方法接受這兩個參數。

處理這個問題的最佳方法是什麼?

回答

12

什麼是無限級?在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/ 

如果你認爲這樣的情況是可能的,那麼恕我直言,一個簡單的測試(不整個層次)是不夠的。

您對建議的解決方案有什麼疑問?在循環結束時,變量類別將保存正確的category_slugs[-1],並且您將在categories中提供整個層級結構。不要擔心性能,我最好的建議是:不要在分析之前優化一個優雅的解決方案(你會感到驚訝)。

+0

我可以用category_slugs [-1]查詢數據庫,如果獲得的類別沒有子類,我們知道它是一個葉子類別,否則,我們知道它有子類別,我們顯示它們? – AlexBrand 2012-02-29 13:43:29

+0

@alexBrand:查看更新的答案。 – 2012-02-29 19:42:23

+0

你是完全正確的。我沒有想到在不同類別中使用相同的子類別名稱的可能性。 – AlexBrand 2012-02-29 20:54:23