2013-04-24 2 views
0

Я пытаюсь получить один запрос из вывода рекурсивной функции, и я сталкиваюсь с проблемой производительности.Batch union django querysets

По существу, кажется, что попытка объединить отдельные заказы удваивает время, затрачиваемое на обработку (я ожидал этого из-за реализации), но мне было интересно, могу ли я сделать это более эффективно.

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