2016-06-10 24 views
1

樣品結構類別:使用Django,MPTT只得到有項目

全部大寫:類別

混合大小寫:項目

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」類別。 「衣服」類別不應顯示,因爲它是空的,並且「書籍」類別不應顯示,因爲雖然它具有子類別,但子類別沒有任何項目。

同樣,「ELECTRONICS」頁面應該只顯示「PHONES」類別。 「LAPTOPS」類別不應顯示,因爲它是空的,並且「TABLETS」類別不應顯示,因爲雖然它具有子類別,但該子類別沒有任何項目。

同樣,「PHONES」頁面應該只顯示「APPLE」和「MOTOROLA」類別,因爲「SAMSUNG」類別爲空。

我已經試過了索引頁內容:

Category.objects.root_nodes().exclude(children__isnull=True)

這成功地排除了「服裝」類別,但不排除「圖書」類別。我明白爲什麼這不起作用,但我不知道該怎麼做。

回答

1

我不認爲這是可能的只使用django-mptt經理的方法和領域。

您可以想出一個查詢,用項目篩選所有類別(如SELECT DISTINCT category_id FROM items),然後找出這些類別的根節點集合。

壞消息是,可能你的查詢將不會爲你所描述的用例執行得非常好,也許你可以有一些非規範化的領域(也許是這樣子樹項目計數)提供或者使用搜索引擎像elasticsearch此種類的任務。

+1

我結束了去非規範化的領域。謝謝! – Nick