Gun*_*niH 4 python django caching django-queryset
所以我目前正在使用 Python/Django,我遇到了一个问题,即 Django 在“会话中”缓存查询集。
如果我运行python manage.py shell并这样做:
>>> from myproject.services.models import *
>>> test = TestModel.objects.filter(pk = 5)
>>> print test[0].name
>>> John
Run Code Online (Sandbox Code Playgroud)
现在,如果我直接在 SQL 中将它更新为 Bob 并再次运行它,它仍然会说 John。但是,如果我按 CTRL+D 退出(退出)并运行相同的操作,它将已更新,现在将打印 Bob。
我的问题是我在屏幕上运行 SOAP 服务,它总是返回相同的结果,即使数据被更改。
我需要一种方法来强制查询再次从数据库中实际提取数据,而不仅仅是提取缓存数据。我可以只使用原始查询,但这对我来说不是一个解决方案,有什么想法吗?
查询集未在“会话内”缓存。
在Django文档:缓存和查询集提到:
每个 QuerySet 都包含一个缓存,以最大限度地减少数据库访问。了解它的工作原理将使您能够编写最有效的代码。
在新创建的 QuerySet 中,缓存是空的。第一次对 QuerySet 求值 - 因此,发生数据库查询 - Django 将查询结果保存在 QuerySet 的缓存中并返回已显式请求的结果(例如,下一个元素,如果 QuerySet 正在迭代) . QuerySet 的后续评估重用缓存的结果。
请记住这种缓存行为,因为如果您没有正确使用 QuerySets ,它可能会咬你。
(强调我的)
有关何时评估查询集的更多信息,请参阅此链接。
如果查询集更新对您的应用程序至关重要,则您必须每次都对其进行评估,无论是在单个视图函数中还是使用 ajax。
这就像一次又一次地运行 SQL 查询。就像过去没有可用的查询集一样,您将数据保存在必须刷新的某种结构中。