我试图从递归函数的输出中获取单个查询集,但遇到了性能问题。
基本上,尝试组合单个查询集的行为似乎使处理时间增加了一倍(由于实现的原因,我预计会出现这种情况),但我想知道是否可以更有效地做到这一点。
def intersect(self, list_of_querysets):
combined = list_of_querysets[0]
for queryset in list_of_querysets:
combined = combined | queryset
return [combined]
def _get_template_folders(self, template_folder_list):
"""
:rtype : list
"""
parents = []
for template_folder in template_folder_list:
if not TemplateFolder.objects.filter(pk=template_folder).exists():
continue
templates = TemplateFolder.objects.filter(pk=template_folder)
for template in templates:
parent_folders = self._get_template_folders([template.template_folder_parent_id])
if parent_folders is not None:
parents.extend(parent_folders)
if templates is not None:
parents.append(templates)
if parents:
return parents
else:
return None
template_folders_list = self.intersect(self._get_template_folders(template_folder_list))
发布于 2013-04-24 15:31:06
如果看不到你的模型,就很难判断,但你的TemplateFolder模型似乎是某种树结构。如果是这样的话,您应该研究一下使用MPTT之类的东西将其存储在数据库中:这是一种算法,可以根据左右节点值将树结构的描述注释到每一行上,从而使查询特定父节点下的所有内容变得非常高效。有一个很棒的Django实现:django-mptt。
https://stackoverflow.com/questions/16195854
复制