【问题标题】:Batch union of django querysetsdjango 查询集的批量联合
【发布时间】:2013-04-18 05:34:23
【问题描述】:

我正在尝试从递归函数的输出中获取单个查询集,但遇到了性能问题。

基本上,尝试组合单个查询集的行为似乎使处理时间增加了一倍(由于实施,我期待这一点)但我想知道我是否可以更有效地做到这一点。

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

【问题讨论】:

    标签: python django django-1.3


    【解决方案1】:

    如果没有看到您的模型,很难判断,但您的 TemplateFolder 模型似乎是某种树结构。如果是这样,您应该研究使用 MPTT 之类的东西将其存储在数据库中:这是一种算法,它根据左右节点值在每一行上注释树结构的描述,因此可以查询 a 下的所有内容特定的父级效率极高。有一个很棒的 Django 实现:django-mptt

    【讨论】:

    • 它是而且我应该提到 get_template_folders 的效率与对我自己的限制一样有效。我想做的是将它与 intersect 结合起来,以加快代码的重复数据删除部分,因为 get_template_folders 会产生很多重复。我很想使用 django-mptt 之类的东西,但不幸的是,我们与另一个设置了数据库表的应用程序非常紧密地耦合。我们只是与它交互...感谢您的关注。
    猜你喜欢
    • 2023-03-27
    • 2019-12-04
    • 2022-11-08
    • 2013-07-13
    • 1970-01-01
    • 2011-05-23
    • 2017-03-01
    • 2014-05-31
    • 2011-09-08
    相关资源
    最近更新 更多