Django查询集链接、子集和缓存

2024-05-16 23:09:11 发布

您现在位置:Python中文网/ 问答频道 /正文

我知道查询集是懒惰的,它们只有在某些条件下才是evaluated,以避免总是访问数据库。在

我不知道的是,如果给定一个通用的查询集(检索所有的项),然后使用它来构造一个更精确的查询集(例如添加一个过滤器)是否会导致多个sql查询?在

示例:

all_items = MyModel.objects.all()
subset1 = all_items.filter(**some_conditions)
subset2 = subset1.filter(**other_condition)

1)这会创建3个不同的sql查询吗? 或者这都取决于是否对3个变量求值(例如迭代它们)?在

2)这是有效的,还是最好是获取所有的项目,然后将它们转换成一个列表,然后用python过滤它们?在


Tags: 数据库过滤器示例sqlobjectsitemssomeall
1条回答
网友
1楼 · 发布于 2024-05-16 23:09:11

1)如果只枚举最终查询集subset2,则只执行一个数据库查询请求,这是最佳的。在

2)避免过早的优化(大部分应用程序代码编写完成后,在对适当数量的数据进行测量之前)。如果数据库变大,你永远不知道什么是最终最重要的问题。E、 如果你要求一个子集,那么由于在数据库中缓存,查询通常更快。内存量与其他优化相反。也许你不能把所有的数据保存在以后的内存中。对于以后可能的优化,一个清晰可读的代码比20%的优化更重要,后者必须在以后删除才能继续。在

关于查询(惰性)评估的其他重要段落:
When QuerySets are evaluated
QuerySets are lazy
Laziness in Django

相关问题 更多 >