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() 是不是遵循反向关系查找?
prefetch_related 上的 Django ORM 注释