在保持QuerySet的情况下强制进行查询集求值,这是否可行?

12

我想对一个queryset进行一次评估,即将对象提取到本地内存中,然后继续执行各种filter命令。

当然,我可以:

  • 退而使用列表推导和其他本地python语法,但在许多情况下,django ORM的语法更易读。
  • 跳过评估基础queryset,但这样做后,由于我需要进行相当多的filter操作,我会受到性能影响。

那么..是否有可能在保留结果作为queryset对象的情况下强制对queryset进行评估?

3个回答

5

只需要执行len(myqueryset)

或者只需进行条件检查即可强制进行评估。


2
当你强制使用queryset对象时,它将无法保留。但你可以尝试像这样做:
In : list(Project.objects.values_list('owner', 'owner__email'))
Out: [(1, 'admin@example.com')]

因此,使用values_list来保留您将使用的数据。

问候。


1
你可以通过迭代查询集来轻松强制评估:只要忽略迭代结果,你的对象就保持为查询集。
for item in myqueryset:
    pass

然而,这并不能满足您的需求,因为您想在评估的查询集上调用进一步的筛选方法。这是行不通的,因为filter()涉及修改基础查询,并且总是会访问数据库。
我不知道为什么您认为跳过评估查询集会导致性能下降:相反,您提出的评估是不必要的步骤。

1
list(myqueryset)会产生相同的效果(当然,只要您不重新绑定myqueryset)。只是这么说... - bruno desthuilliers

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接