サンプル構造:
すべて大文字:カテゴリ
混合ケース:アイテム
ROOT ├── BOOKS │ ├── FICTION │ │ └── CLASSICS │ └── NON-FICTION ├── CLOTHING └── ELECTRONICS ├── LAPTOPS ├── PHONES │ ├── APPLE │ │ ├── iPhone 6 │ │ ├── iPhone 6 Plus │ │ ├── iPhone 6S │ │ └── iPhone 6S Plus │ ├── MOTOROLA │ │ ├── Moto G4 │ │ ├── Moto G4 Play │ │ ├── Moto G4 Plus │ │ └── Moto X │ └── SAMSUNG └── TABLETS └── APPLE
インデックスページに「ELECTRONICS」カテゴリのみを表示させようとしています。「CLOTHING」カテゴリは空であるため表示されません。また、「BOOKS」カテゴリも子カテゴリはありますがアイテムがないため表示されません。
同様に、「ELECTRONICS」ページには「PHONES」カテゴリのみを表示する必要があります。「LAPTOPS」カテゴリは空であるため表示されません。また、「TABLETS」カテゴリも表示されません。これは、子カテゴリがありますが、その子カテゴリにはアイテムがないためです。
同様に、「SAMSUNG」カテゴリは空であるため、「PHONES」ページには「APPLE」カテゴリと「MOTOROLA」カテゴリのみが表示されます。
インデックスページで試したこと:
Category.objects.root_nodes().exclude(children__isnull=True)
これにより、「CLOTHING」カテゴリは正常に除外されますが、「BOOKS」カテゴリは除外されません。これが機能しない理由は理解できますが、代わりに何をすべきかわかりません。
これは、django-mptt
マネージャーのメソッドとフィールドだけでは不可能だと思います。
すべてのカテゴリをアイテムでフィルタリングするクエリを考え出し(のようなものを考えてくださいSELECT DISTINCT category_id FROM items
)、それらのカテゴリのルートノードのセットを見つけることができます。
悪いニュースは、おそらくあなたが説明したユースケースではクエリがうまく機能しないことです。おそらく、非正規化フィールド(サブツリーアイテム数など)を用意する余裕があるかelasticsearch
、この種のタスクのような検索エンジンを使用できます。
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加