样本结构:
ALL UPPERCASE:类别
混合案例:项目
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”类别。 “衣服”类别不应该显示,因为它是空的,“BOOKS”类别不应该出现,因为虽然它有子类别,但子类别没有任何项目。
同样,“ELECTRONICS”页面只应显示“PHONES”类别。 “LAPTOPS”类别不应该显示,因为它是空的,“TABLETS”类别不应该出现,因为虽然它有子类别,但该子类别没有任何项目。
同样,“PHONES”页面只应显示“APPLE”和“MOTOROLA”类别,因为“SAMSUNG”类别为空。
我为索引页面尝试了什么:
Category.objects.root_nodes().exclude(children__isnull=True)
这成功排除了“服装”类别,但不排除“BOOKS”类别。我理解为什么这不起作用,但我不知道该怎么做。
答案 0 :(得分:1)
我不认为仅使用django-mptt
经理方法和字段就可以实现这一点。
您可以提出一个查询来过滤所有类别的项目(想象SELECT DISTINCT category_id FROM items
),然后找出这些类别的根节点集。
坏消息是,您的查询可能对您描述的用例表现不佳,也许您可以负担得起一些非规范化字段(可能类似于子树项目计数)或使用像{{这样的搜索引擎1}}用于这种任务。