所以我目前正在使用Python / Django,我遇到一个问题,Django在一个会话中缓存查询集。
如果我运行python manage.py shell
并执行此操作:
>>> from myproject.services.models import *
>>> test = TestModel.objects.filter(pk = 5)
>>> print test[0].name
>>> John
现在,如果我在SQL中直接将它更新为Bob并再次运行它,它仍然会说John。如果我按CTRL + D out(退出)并运行相同的东西,它将更新,现在将打印Bob。
我的问题是我在屏幕上运行SOAP服务,即使数据发生变化,也会始终返回相同的结果。
我需要一种方法来强制查询实际上再次从数据库中提取数据,而不仅仅是拉取缓存的数据。我可以使用原始查询,但这不是我的解决方案,任何想法?
答案 0 :(得分:2)
查询集未在会话中缓存'。
Django documentation: Caching and QuerySets提及:
每个QuerySet都包含一个缓存来最小化数据库访问。了解它的工作原理将允许您编写最有效的代码。
在新创建的QuerySet中,缓存为空。第一次评估QuerySet - 并因此发生数据库查询 - Django将查询结果保存在QuerySet的缓存中并返回已明确请求的结果(例如,如果正在迭代QuerySet,则返回下一个元素) 。对QuerySet的后续评估将重用缓存的结果。
请牢记此缓存行为,因为如果您未正确使用QuerySet,可能会咬你。
(强调我的)
有关何时评估查询集的详细信息,请参阅this link。
如果您的应用程序对其查询集进行更新至关重要,则必须每次对其进行评估,无论是在单个视图函数中还是使用ajax。
就像一次又一次地运行SQL查询一样。就像过去没有可用的查询集一样,并且您将数据保存在某个必须刷新的结构中。