首页 > 解决方案 > 使用 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 文档,但没有看到这样做的方法。也许我忽略了它。有什么建议么?

标签: djangodjango-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()

推荐阅读