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

Using django-mptt to get only the categories that have items

示例结构:

全部大写:类别

大小写混合:项目

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" 类别也不应显示,因为尽管它有一个子类别,但该子类别没有任何项目。

同样,"PHONES" 页面应该只显示 "APPLE" 和 "MOTOROLA" 类别,因为 "SAMSUNG" 类别是空的。

我为索引页所做的尝试:

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

这样成功排除了"CLOTHING"类,但没有排除"BOOKS"类。我明白为什么这不起作用,但我不知道该怎么做。

我认为仅使用 django-mptt 管理器方法和字段是不可能的。

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

坏消息是对于您描述的用例,您的查询可能不会执行得很好,也许您可​​以负担得起一些非规范化字段(可能像子树项目计数)或使用像 elasticsearch 用于此类任务。