使用 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
用于此类任务。
示例结构:
全部大写:类别
大小写混合:项目
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
用于此类任务。