我知道查询集是懒惰的,它们只有在某些条件下才是evaluated,以避免总是访问数据库。在
我不知道的是,如果给定一个通用的查询集(检索所有的项),然后使用它来构造一个更精确的查询集(例如添加一个过滤器)是否会导致多个sql查询?在
示例:
all_items = MyModel.objects.all()
subset1 = all_items.filter(**some_conditions)
subset2 = subset1.filter(**other_condition)
1)这会创建3个不同的sql查询吗? 或者这都取决于是否对3个变量求值(例如迭代它们)?在
2)这是有效的,还是最好是获取所有的项目,然后将它们转换成一个列表,然后用python过滤它们?在
1)如果只枚举最终查询集
subset2
,则只执行一个数据库查询请求,这是最佳的。在2)避免过早的优化(大部分应用程序代码编写完成后,在对适当数量的数据进行测量之前)。如果数据库变大,你永远不知道什么是最终最重要的问题。E、 如果你要求一个子集,那么由于在数据库中缓存,查询通常更快。内存量与其他优化相反。也许你不能把所有的数据保存在以后的内存中。对于以后可能的优化,一个清晰可读的代码比20%的优化更重要,后者必须在以后删除才能继续。在
关于查询(惰性)评估的其他重要段落:
When QuerySets are evaluated
QuerySets are lazy
Laziness in Django
相关问题 更多 >
编程相关推荐