评估QuerySet时,通常会缓存其结果。如果数据库中的数据自评估以来可能发生了变化,则可以通过在先前评估的QuerySet上调用All()来获得相同查询的更新结果。
buut然后在部分下,表明在子对象上使用
prefetch_related
.all()
使用缓存的结果:
>>> restaurants = Restaurant.objects.prefetch_related(
... Prefetch("pizzas", queryset=queryset),
... )
>>> vegetarian_pizzas = restaurants[0].pizzas.all()
为什么它会触发外部数据库查询,而不是为子对象触发数据库查询?我很困惑
vegetarian_pizzas
不会触发数据库查询。文档列表评估了QuerySets,并且运行
all()
不是其中一种情况。
评估查询时,其结果被缓存;但是缓存绑定到QuerySet对象。 .all()
创建了一个新的QuerySet,该QuerySet尚未进行评估,因此尚未缓存;因此,如果对其进行评估时,它将获取新数据,而不是依靠缓存。因此,您发布的代码没有任何部分触发数据库查询。
.all()
.all()
(例如,
restaurants
或vegetarian_pizzas
)后,它将与披萨一起缓存餐厅。如果您the take take,则取自缓存,而不是再次触摸数据库。但是,restaurants
创建一个新的QuerySet,该QuerySet无法访问评估的QuerySet中的缓存。