django - 使用 django-mptt 查询数据库中包含至少一个子类别和至少一个产品的所有根类别
问题描述
我有一个Category
模型,我使用 django-mptt 来创建子类别(和子子类别等)。我也有分配到类别的产品。
我想在数据库中查询具有至少一个子类别和至少一种产品的所有根类别。例如,考虑这个数据结构:
Category: Dairy (0 subcategories, 1 product)
Product: Milk
Category: Fruit (1 subcategory, 0 products)
Subcategory: Red (0 subcategories, 0 products)
Category: Vegetables (1 subcategory, 0 products)
Subcategory: Green (0 subcategories, 1 product)
Product: Cucumber
Category: Junk Food (1 subcategory, 1 product)
Product: Doritos
Subcategory: Chocolate (0 subcategories, 1 product)
Product: Snickers
在这种情况下,我希望查询只返回“垃圾食品”类别,因为它是唯一符合所有三个条件的类别(根类别,至少有一个子类别,至少有一种产品)。
我查看了 django-mptt 文档,但没有看到这样做的方法。也许我忽略了它。有什么建议么?
解决方案
您可以筛选子类别和产品的类别上的多对一字段。所以也许是这样的:
Category.objects.filter(
parent=None, # must be root category
children__in=Category.objects.filter(level=1), # must have at least one sub-category
products__in=Product.objects.all() # must have at least one product
).distinct()
或者
Category.objects.filter(
parent=None, # must be root category
children__isnull=False, # must have at least one sub-category
products__isnull=False # must have at least one product
).distinct()
推荐阅读
- haskell - 为什么 GHC 拒绝允许这种存在类型函数?
- python - 如何在 Pandas Dataframe 中合并多个名称相似的列而不丢失数据
- sql-server - Powershell 还原数据库
- java - Guice - 有没有办法将依赖对象的新实例注入单例?
- java - 使物体更容易和更清洁
- node.js - throw new MongooseError('openUri()` 的 `uri` 参数必须是 ' +
- sql - 使用 LIKE 运算符时将数据类型 varchar 转换为 bigint 时出错
- c++ - 如何从函数修改对象?
- jquery - 使用 jQuery 在 nav-pills 上活动的类
- javascript - 侧边栏导航不适用于角度和物化 css