2012-02-29 13 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は、カテゴリ/サブカテゴリ/サブサブカテゴリになりたい:

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

私のビューメソッドはこれら2つのパラメータを受け入れるので、基本的に1つのサブカテゴリのみを許可します。

これを処理する最善の方法は何ですか?

答えて

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) 
    ... 

がCategory.Metaに unique_together = ('slug', 'parent',)を追加することを忘れないでください、そうでなければ、運命にしています。

は、[更新]

得られたカテゴリに子がない場合、私はちょうど[-1] category_slugsでDBを照会し、可能性があり、我々はそうでない場合、我々はそれが、サブカテゴリ、我々を持って知って、その葉のカテゴリを知っています見せる? - alexBrand

@alexBrand:以下の架空のURLを考えてみます。

/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]を使用してdbをクエリできますか?取得したカテゴリに子がない場合は、そのリーフカテゴリを知っています。そうでなければ、サブカテゴリがあり、表示します。 – AlexBrand

+0

@alexBrand:更新された回答を参照してください。 –

+0

あなたはまったく正しいです。私は、異なるカテゴリに同じサブカテゴリ名を持つ可能性については考えていませんでした。 – AlexBrand

関連する問題