Django,使用“|”:表达式树太大(最大深度1000)

时间:2018-05-17 11:17:06

标签: python django sqlite

我正在尝试将多个查询集连接在一起。我暂时从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个属性,因此我可以理解查询变得太长/太复杂。

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

1 个答案:

答案 0 :(得分:1)

我认为您希望获得所有Property个对象Function某个项目。

我们可以通过以下方式查询:

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

这是一个查询集,其中包含function(我假设这是ForeignKey)的project所有属性对象(可能再次为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)