Django 缓存查询(我不想要)

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 服务,它总是返回相同的结果,即使数据被更改。

我需要一种方法来强制查询再次从数据库中实际提取数据,而不仅仅是提取缓存数据。我可以只使用原始查询,但这对我来说不是一个解决方案,有什么想法吗?

Wto*_*wer 8

查询集未在“会话内”缓存。

Django文档:缓存和查询集提到:

每个 QuerySet 都包含一个缓存,以最大限度地减少数据库访问。了解它的工作原理将使您能够编写最有效的代码。

在新创建的 QuerySet 中,缓存是空的。第一次对 QuerySet 求值 - 因此,发生数据库查询 - Django 将查询结果保存在 QuerySet 的缓存中并返回已显式请求的结果(例如,下一个元素,如果 QuerySet 正在迭代) . QuerySet 的后续评估重用缓存的结果。

请记住这种缓存行为,因为如果您没有正确使用 QuerySets ,它可能会咬你

(强调我的)

有关何时评估查询集的更多信息,请参阅此链接

如果查询集更新对您的应用程序至关重要,则您必须每次都对其进行评估,无论是在单个视图函数中还是使用 ajax。

这就像一次又一次地运行 SQL 查询。就像过去没有可用的查询集一样,您将数据保存在必须刷新的某种结构中。

  • 在没有任何解释的情况下对帖子投反对票真是太荒谬了。 (4认同)
  • 在 2017 年仍然相关,这个答案为我节省了进一步挖掘的时间。 (3认同)