does`.all()`在django重新查询数据库或使用缓存? 我收到非常矛盾的消息。来自Django QuerySet文档,我正在阅读(https://docs.djangoproject.com/en/5.1/ref/ref/models/querysets/querysets/#django.db.models.query.queryset.queryset.all): 当queryset为

问题描述 投票:0回答:1

评估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()
python django
1个回答
0
投票
.all()

(例如,

restaurants
vegetarian_pizzas)后,它将与披萨一起缓存餐厅。如果您the take take,则取自缓存,而不是再次触摸数据库。但是,
restaurants
创建一个新的QuerySet,该QuerySet无法访问评估的QuerySet中的缓存。

最新问题
© www.soinside.com 2019 - 2025. All rights reserved.