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