是否可以在保持查询集的同时强制进行查询集评估

时间:2013-12-17 09:24:28

标签: django

我想评估一次查询集,即将对象提取到本地内存,然后继续对获取的对象执行各种filter命令。

当然我可以:

  • 删除列表推导和其他本机python语法,但在许多情况下,django ORM的语法更具可读性。
  • 跳过评估基本查询集,但之后我会受到性能影响,因为我稍后需要进行相当多的filter操作。

那么..是否可以强制进行查询集评估,同时将结果保存为查询集对象?

3 个答案:

答案 0 :(得分:3)

如何做len(myqueryset)

或者只是进行条件检查也可以强制进行评估。

答案 1 :(得分:1)

您可以通过迭代查询集轻松强制进行评估:只要忽略迭代结果,您的对象就会保持查询集。

for item in myqueryset:
    pass

但是,这并不能真正做到你想要的,因为你说你想在评估的查询集上调用更多的过滤器方法。这不起作用,因为filter()涉及修改基础查询,并且将始终命中数据库。

我不知道为什么你认为如果你跳过评估查询集就会受到性能影响:情况正好相反,你提议的评估是不必要的步骤。

答案 2 :(得分:1)

强制设置时不能保留queryset对象。但是您可以执行以下操作:

In : list(Project.objects.values_list('owner', 'owner__email'))
Out: [(1, 'admin@example.com')]

因此,使用values_list保留要使用的数据。

问候。