2013-04-24 69 views
0

我试图从递归函数的输出中获取单个查询集,并且遇到了性能问题。django查询集的批量联合

基本上,试图结合个别查询集的行为似乎将处理时间加倍(我期待这是因为实现),但我想知道如果我能更有效地做到这一点。

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)) 

回答

1

没有看到你的模型很难说,但看起来你的TemplateFolder模型是某种树形结构。如果是这样的话,你应该使用类似MPTT的东西进行调查以将其存储在数据库中:这是一种算法,用于根据左右节点值向每一行注释树结构的描述,从而查询特定的父母非常有效。有一个伟大的Django实现:django-mptt

+0

这是,我应该提到,get_template_folders是一样有效,因为它可以与自己的限制强加。我期望做的是将它与交叉相结合,以加快代码的重复数据删除部分,因为get_template_folders输出了大量的错误。我很喜欢使用类似django-mptt的东西,但不幸的是,我们与另一个已经列出数据库表的应用程序紧密耦合。我们只是与它接口...谢谢你看看。 – Jharwood 2013-04-24 15:52:24