Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 在Django queryset中迭代无限数量的子对象_Python_Django - Fatal编程技术网

Python 在Django queryset中迭代无限数量的子对象

Python 在Django queryset中迭代无限数量的子对象,python,django,Python,Django,我有一个Django模型,它定义了一个类别列表。每个类别都可以是另一个类别的子类别,并且这个类别列表的深度可能会持续相当长的时间 型号.py class Category(models.Model): code = UUIDField(unique=True, primary_key=True) name = models.CharField(max_length=100, null=True, blank=True, unique=True) parent_cat =

我有一个Django模型,它定义了一个类别列表。每个类别都可以是另一个类别的子类别,并且这个类别列表的深度可能会持续相当长的时间

型号.py

class Category(models.Model):
    code = UUIDField(unique=True, primary_key=True)
    name = models.CharField(max_length=100, null=True, blank=True, unique=True)
    parent_cat = models.ForeignKey('self', null=True, blank=True)
例如,考虑女性服装的一个类别。它可能具有以下内容:

    queryset = Category.objects.filter(parent_cat=kwargs['code'])

    all_children = []
    all_children.append(queryset.values())

    for c in queryset:
        children = Category.objects.filter(parent_cat=c.code)
        if children:
            all_children.append(children.values())
    all_children.append(children)
女式>服装>连衣裙>夏季

这一切都很好,但我想分别构建一个函数,该函数可以构建一个列表,其中包含树中每个类别的外推视图。为此,我写了以下内容:

    queryset = Category.objects.filter(parent_cat=kwargs['code'])

    all_children = []
    all_children.append(queryset.values())

    for c in queryset:
        children = Category.objects.filter(parent_cat=c.code)
        if children:
            all_children.append(children.values())
    all_children.append(children)
我意识到这段代码可能相当草率,我还在学习

正如您可能意识到的,这只会给我两个级别的子对象

我的问题是:我可以用什么最有效的方式来编写这段代码,以便它能够找到所有可能的类别,直到它到达最后一个没有子对象的对象


谢谢

您可以尝试使用递归,如下所示: 用适当的数据类型替换列表

def parseQueryset(queryset)


    for x in queryset:
        if isinstancex(x, list):
            parseQueryset(x)
        else:
            #do stuff

您正在寻找-您可以使用django mptt包:

查看这是一个树遍历应用程序。您可能会在他们的代码中找到一个解决方案,或者使用django mptt本身。谢谢分享。一旦我知道了我想要的术语(递归),我就可以从那里算出它了!非常感谢:)