7

Django Wiki で、これと同様の Category 実装を使用しようとしています。親カテゴリに関連付けられたすべてのオブジェクトを取得するために検索を行う Django の方法を知りたいです。たとえば、カテゴリ「TV」があり、サブカテゴリ「LED」、「LCD」、および「プラズマ」がある場合、すべてのサブカテゴリとサブサブカテゴリを再帰的に調べずに、すべての TV を簡単に照会するにはどうすればよいでしょうか (任意です)。

コードに関しては、次のようなことを考えていました。

class Item(models.Model):
   name = ...
   ...
   category = models.ForeignKey(Category, null=True, blank=True)

このタイプの実装では、必要なことを行う簡単な方法はありますか、それとも他のより良い解決策はありますか?

ありがとうございました!

4

3 に答える 3

8

厳密なカテゴリとサブカテゴリを強制したいが、説明したような結果で高速検索を実行する機能も備えている場合は、実際にユーザーがアイテム自体にタグを付けることを許可しない「タグ」テーブルを作成することをお勧めします。カテゴリをアイテムに割り当てるとすぐに、そのアイテムのタグ テーブルに、カテゴリ ツリーのルート ノードまでのすべての親カテゴリを入力します。

たとえば、次の場合: alt テキスト http://img509.yfrog.com/img509/9845/photoho.jpg

タグ テーブルは次のようになります。

   id   |   tag_name   |   tv_id
   1    |     "tv"     |     1
   2    |     "sd"     |     1    
   3    |     "crt"    |     1  
   4    |     "tv"     |     2  
   5    |     "HD"     |     2  
   6    |     "LCD"    |     2  
   7    |     "tv"     |     3  
   8    |     "HD"     |     3  
   9    |   "plasma"   |     3

これで、クエリセットは次のようになりますitems=Item.objects.filter(tag='TV')

于 2010-01-14T19:00:13.120 に答える
5

Category参照したページで使用されているのと同じ方法でモデルを使用していると仮定すると、カテゴリ「TV」はCategorynull を持つインスタンスにparentなり、「プラズマ」と「LCD」はCategory「親としてのテレビ」カテゴリ。

>>> tv=Category(name="TV")
>>> tv.save()
>>> lcd=Category(name="LCD", parent=tv)
>>> lcd.save()
>>> plasma=Category(name="Plasma", parent=tv)
>>> plasma.save()

いくつかのアイテムを作成する

>>> vizio=Item(name="Vizio", category=lcd)
>>> vizio.save()
>>> plasmatron=Item(name="PlasmaTron", category=plasma)
>>> plasmatron.save()

アイテム クエリセットを取得する

>>> items=Item.objects.filter(category__parent=tv)

また

>>>> items=Item.objects.filter(category__parent__name='TV')

これは、必要なものの範囲内にあるように見えますか?

于 2010-01-14T06:02:02.007 に答える
0

MPTT を使用する django-categories を使用している場合は、次のことができます。

Entry.objects.filter(category__in=category.get_descendants(True))
于 2013-06-25T23:41:54.387 に答える