Django prefetch_related缓存不反映更改

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Django prefetch_related缓存不反映更改相关的知识,希望对你有一定的参考价值。

我有一个模特班克斯。我有六个实体。

这是我的预取代码。

queryset = Banks.objects.all().prefetch_related('field1','field2')

当我将新实体输入我的Banks模型并获取数据时,我仍然只获得旧数据。下载数据时,新添加的实体没有反映出来。

答案

请记住,与QuerySets一样,任何暗示不同数据库查询的后续链接方法都将忽略以前缓存的结果,并使用新的数据库查询检索数据。所以,如果你写下面的内容:

>>> pizzas = Pizza.objects.prefetch_related('toppings')
>>> [list(pizza.toppings.filter(spicy=True)) for pizza in pizzas]

...然后pizza.toppings.all()被预取的事实对你没有帮助。 prefetch_related('toppings')暗示pizza.toppings.all(),但pizza.toppings.filter()是一个新的和不同的查询。预取缓存在这里无济于事;实际上它会损害性能,因为您已经完成了未使用的数据库查询。所以请谨慎使用此功能!

此外,如果在相关管理器上调用数据库更改方法add()remove()clear()set(),则将清除该关系的任何预取缓存。

来自docs

以上是关于Django prefetch_related缓存不反映更改的主要内容,如果未能解决你的问题,请参考以下文章

Django:prefetch_related() 是不是遵循反向关系查找?

Django:prefetch_related 没有效果

prefetch_related 上的 Django ORM 注释

django prefetch_related 很多查询

Django - 过滤 prefetch_related 查询集

Django prefetch_related 与限制