我构造了一个函数,该函数对于可以有父母的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或递归函数更有效地做到这一点吗?请帮助我
答案 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中循环“家族树”,而是使用查询来获取所有组。