Django递归模型查找

2024-04-25 00:14:29 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个经常性的类别模型(每个类别可以有一个父类别),我也有一个产品模型与外键“核心类别”如下。是否有可能查询顶级类别(非核心)内的所有产品?你知道吗

例如,我的分类树是:

---Sales (main) (parent = None)
    ---Crm (core) (parent = Sales)
    ---Marketing Automation (core) (parent = Sales)
    ---AI (parent = Sales)
       ---BOTS (core) (parent = AI)
       ---NLP (core) (parent = AI)

我想查询“Sales”或“AI”中的所有产品

型号:

class Category(models.Model):
    name = models.CharField(max_length=255)
    link = models.URLField(max_length=255, null=True, blank=True)
    core = models.BooleanField()
    main = models.BooleanField()
    parent = models.ForeignKey('self', on_delete=models.SET_NULL,
                               null=True, default=None)

    def __str__(self):
        return self.name


class Product(models.Model):
    name = models.CharField(max_length=255)
    link = models.URLField(max_length=255, null=True, blank=True)
    category = models.ForeignKey(Category, on_delete=models.SET_NULL,
                                 null=True, default=None)

    def __str__(self):
       return self.name

谢谢你的帮助!你知道吗

编辑:对于这种特殊情况,我认为文件夹中的文件是最好的等价物。单个文件(产品)只知道其父目录(核心类别),但此父目录可以是其父目录的子文件夹。我想为子目录中的所有文件(产品)查询顶级文件夹(类别)。你知道吗


Tags: namecoreself文件夹nonetrue产品models
1条回答
网友
1楼 · 发布于 2024-04-25 00:14:29

首先,在Category实例上使用反向外键查找category_set获取所有子类别。你知道吗

解决方案

def recursive_sub_category(top_level_category_name, sub_core_categories=None):
    if sub_core_categories is None:
        sub_core_categories = list()

    top_level_category = Category.objects.get(name=top_level_category_name)

    _sub_core_categories = top_level_category.category_set.filter(core=True, main=False)

    if _sub_core_categories.count() > 0:
        sub_core_categories.append(*_sub_core_categories)

    sub_main_categories = top_level_category.category_set.filter(main=True, core=False)
    for category in sub_main_categories:
        _sub_core_categories = recursive_sub_category(
            category.name,
            sub_core_categories=sub_core_categories
        )
        if len(_sub_core_categories) > 0:
            sub_core_categories.append(*_sub_core_categories)

    return sub_core_categories

sub_core_categories = recursive_sub_category("Sales")
core_products_under_sales = Product.objects.filter(
    category__in=sub_core_categories
)

相关问题 更多 >