gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 02:26:04 26 4
gpt4 key购买 nike

我正在尝试将许多查询集连接在一起。我尝试了来自 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)

关于python - Django,使用 "|": Expression tree is too large (maximum depth 1000),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50390108/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com