Python 递归或itertool而不是for循环

Python 递归或itertool而不是for循环,python,django,Python,Django,我构造了一个函数,用于为可以有父对象的组,获取给定组的所有后代 现在我使用进行循环,如何提高效率 我的代码是这样的 def get_group_last111(group): groupmap = services_models.GroupMapping.objects.filter(parent_id=group) group_list = [group.id] for each in groupmap: group_li

我构造了一个函数,用于为可以有父对象的
,获取给定组的所有后代

现在我使用
进行循环,如何提高效率

我的代码是这样的

def get_group_last111(group):
        groupmap = services_models.GroupMapping.objects.filter(parent_id=group)
        group_list = [group.id]
        for each in groupmap:
            group_list.append(each.group_id)
            groupmaploop = services_models.GroupMapping.objects.filter(parent_id=each.group_id)
            if groupmaploop.exists():
                for each_data in groupmaploop:
                    group_list.append(each_data.group_id)
                    groupmaploop1= services_models.GroupMapping.objects.filter(parent_id=each_data.group_id)
                    if groupmaploop1.exists():
                        for each_data1 in groupmaploop1:
                            group_list.append(each_data1.group_id)
                            groupmaploop3= services_models.GroupMapping.objects.filter(parent_id=each_data1.group_id)
                            if groupmaploop3.exists():
                                for each_data2 in groupmaploop1:
                                    group_list.append(each_data2.group_id)
                                    groupmaploop4= services_models.GroupMapping.objects.filter(parent_id=each_data2.group_id)
                                    if groupmaploop4.exists():
                                      for each_data5 in groupmaploop4:
                                        group_list.append(each_data5.group_id)
        print set(group_list)
        return set(group_list)

我可以使用itertool或递归函数更有效地执行此操作。请帮助我

如果我理解正确,您需要给定
对象的所有子体。所以孩子,孙子,曾孙等等

我们可以通过查询关系的深度来实现这一点,如:

def get_group_last111(group):
    result = {group.id}
    cur = result
    while cur:
        cur = set(
            GroupMapping.objects.filter(parent_id__in=cur)
                                .values_list('group_id', flat=True)
        )
        result.update(cur)
    return result

如果从给定的
产生了四代,那么这将需要四次查询。因此,我们不会在Python中循环“家族树”,而是使用查询获取所有组。

您能先解释一下您想要什么吗?不是你想要的吗?我想用递归函数代替循环中的循环。不,我是说你想要什么结果。例如:“所有
group_id
s满足“this”条件。看起来这可以在一次(或者2-3次)查询中重写,这将使其速度更快。我想要所有的group_id。实际上它对我有效。但效率不高。但在这里,您(在代码中)将自己限制为五代人。