2015-06-04 82 views
1

所以我目前在Python/Django工作,我有一个问题,Django缓存“会话内”的查询集。Django缓存查询(我不希望它)

如果我运行python manage.py shell和这样做的:

>>> from myproject.services.models import * 
>>> test = TestModel.objects.filter(pk = 5) 
>>> print test[0].name 
>>> John 

现在,如果我再在SQL给Bob直接更新并重新运行它,它还是会说约翰。如果我按CTRL + D出(退出)并运行相同的东西,它将会更新,现在将打印Bob。

我的问题是,我跑在屏幕的SOAP服务,它会始终返回相同的结果,即使数据被改变。

我需要一种方法来强制查询实际上再次拉从数据库中的数据,而不是拉高速缓存的数据。我可以只使用原始查询,但这对我来说不是一个解决方案,任何想法?

+3

试试看这个http://stackoverflow.com/questions/3346124/how-do-i-force-django-to-ignore-any-caches-and-reload-data?rq=1 –

+0

你可以展示您用于更新记录并尝试获取新值的确切代码? – knbk

+0

@ Bilou06 - 谢谢! – GunniH

回答

2

查询集没有在会话中被缓存。

Django documentation: Caching and QuerySets提到:

每个查询集包含一个高速缓存,以尽量减少数据库访问。了解它的工作原理将允许您编写最高效的代码。

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

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

(重点煤矿)

有关详细信息时查询集进行评估上,请参阅this link

如果您的应用程序,他查询集被更新的关键,你必须每次都对其进行评估,一个单一的视图函数中,或使用Ajax。

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

+0

在没有任何解释的情况下downvote一篇文章是如此荒谬。 – Wtower

+0

对不起,这显然不是我,因为我没有代表投票,也没有下降,谢谢你的回复,比洛用上面的链接钉了它:) – GunniH

+0

我没有downvote。我认为这是因为TestModel.objects.filter(pk = 5)'创建了一个新的QuerySet(据我所知) –