Skip to main content
 首页 » 编程设计

python之Django,使用 "|": Expression tree is too large (maximum depth 1000)

2024年09月07日30jackei

我正在尝试将许多查询集连接在一起。我尝试了来自 this 的标记答案前一段时间有问题,但这对我来说不起作用。我需要返回一个 queryset 而不是一个列表。所以我使用了第二个答案中的|。这在当时运行良好,但现在我再次尝试将它用于其他用途时出现以下错误:

Expression tree is too large (maximum depth 1000) 

我最初认为 | 会连接查询集,但在阅读文档后,它似乎连接了实际的查询。如果查询变得太长/太复杂,就会出现这个特定问题。

这就是我想要做的:

def properties(self, request, pk=None): 
    project = self.get_object() 
    if project is None: 
        return Response({'detail': 'Missing project id'}, status=404) 
 
    functions = Function.objects.filter(project=project) 
    properties = Property.objects.none() 
    for function in functions: 
        properties = properties | function.property_set.all() 
    return Response([PropertySerializer(x).data for x in properties]) 

由于 functions 查询返回大约 1200 个结果,并且每个 function 有大约 5 个属性,我可以理解查询变得太长/太复杂了。

如何防止查询变得过于复杂?或者我如何执行多个查询并在之后连接它们,同时将最终结果保留为一个查询集?

请您参考如下方法:

我想你想获取所有Property 对象,这些对象具有作为Function 的某个项目。

我们可以这样查询:

properties = Property.objects.filter(function__project=project) 

因此这是一个包含所有属性对象的查询集,函数(我假设这是一个ForeignKey)作为项目( ForeignKey 可能又是给定的 project)。这也将导致单个查询,但您将避免构建巨大的联合。

或者,您可以分两步完成,但这实际上会使速度变慢:

# probably less efficient 
function_ids = (Function.objects.filter(project=project) 
                                .values_list('pk', flat=True)) 
properties = Properties.object(function_id__in=function_ids)