2013-04-24 141 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