我正在尝试将多个查询集连接在一起。我暂时从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个属性,因此我可以理解查询变得太长/太复杂。
如何防止查询过于复杂?或者我如何执行多个查询并在之后连接它们,同时保持最终结果为查询集?
答案 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)