使用django-mptt仅获取具有项目的类别

时间:2016-06-10 21:07:57

标签: django django-mptt mptt

样本结构:

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”类别。我理解为什么这不起作用,但我不知道该怎么做。

1 个答案:

答案 0 :(得分:1)

我不认为仅使用django-mptt经理方法和字段就可以实现这一点。

您可以提出一个查询来过滤所有类别的项目(想象SELECT DISTINCT category_id FROM items),然后找出这些类别的根节点集。

坏消息是,您的查询可能对您描述的用例表现不佳,也许您可​​以负担得起一些非规范化字段(可能类似于子树项目计数)或使用像{{这样的搜索引擎1}}用于这种任务。