递归或itertool而不是for循环

时间:2018-08-13 07:10:02

标签: python django

我构造了一个函数,该函数对于可以有父母的Group,获得给定组的所有后代。

现在我为此使用for循环,如何提高效率?

我的代码是这样的。

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或递归函数更有效地做到这一点吗?请帮助我

1 个答案:

答案 0 :(得分:0)

如果我正确理解,则需要给定Group对象的所有子孙。这样的孩子,孙子,曾孙等等。

我们可以通过查询关系的 depth 来做到这一点,例如:

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

因此,如果有四代来自给定的group,则将需要四个查询。因此,我们不会在Python中循环“家族树”,而是使用查询来获取所有组。