【问题标题】:Django caching queries (I don't want it to)Django 缓存查询(我不希望这样)
【发布时间】:2015-08-19 02:49:27
【问题描述】:

所以我目前正在使用 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 退出(退出)并运行相同的操作,它将已更新并现在将打印 Bob。

我的问题是我在屏幕中运行 SOAP 服务,它总是返回相同的结果,即使数据被更改。

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

【问题讨论】:

标签: python django caching django-queryset


【解决方案1】:

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

Django documentation: Caching and QuerySets 提到:

每个 QuerySet 都包含一个缓存以最小化数据库访问。了解它的工作原理将使您能够编写最高效的代码。

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

记住这个缓存行为,因为如果你没有正确使用你的查询集,它可能会咬你

(强调我的)

有关何时评估查询集的更多信息,请参阅this link

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

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

【讨论】:

  • 在没有任何解释的情况下投反对票真是太荒谬了。
  • 我也没有投反对票。我认为它已经完成,因为TestModel.objects.filter(pk = 5) 创建了一个新的 QuerySet(据我所知)
  • 在 2017 年仍然相关,这个答案为我节省了进一步挖掘的时间。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-04-01
  • 2020-04-12
  • 2012-05-15
  • 2015-07-25
  • 2013-02-15
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多