2012-12-07 40 views
7

我有一个Django模型,TestModel,通过SQL数据库。Django模型检索相同的结果

每当我做

TestModel.objects.all() 

我看来,如果我来自同一个过程多次运行它会得到相同的结果。我通过手动删除(不使用任何django基元)从模型构建的表中的一行来测试,查询仍然返回相同的结果,即使显然在删除后应该有更少的对象。

是否有某种缓存机制,并且每次我想要检索对象时,django都不会去数据库?

如果存在,是否还有办法强制django转到每个查询的数据库,最好是不写原始SQL查询?

我还应该指定通过重新启动该过程模型再次返回正确的对象,我不再看到已删除的对象,但是如果我再删除一些问题,则会再次出现该问题。

+0

我根本不知道Django,但是最后一次我遇到了类似的问题,我意识到我没有使用我认为是的数据库。你最近还没有改变过这条路,不是吗? – PeterBB

+0

@PeterBB我更新了描述,我确信我正在使用正确的数据库,因为每次重新启动使用模型的进程都会更新这些更改。 –

+0

这是发生在Web请求之间还是在shell级别? – danihp

回答

1

这是因为您的数据库隔离级别是可重复读取的。在django shell中,所有的请求都被包含在一个事务中。

编辑

你可以在你的shell尝试:

from django.db import transaction 
with transaction.autocommit(): 
    t = TestModel.objects.all() 
    ... 
-1

听起来像一个数据库事务的问题。如果在单独进入数据库本身并修改数据时保持打开一个shell会话,那么在shell中打开的事务将不会看到由于隔离而导致的更改。您需要退出并重新加载shell以获取新事务,然后才能看到它们。

请注意,在生产中,交易与请求/响应周期相关联,所以这不会是一个重大问题。

+0

这是生产过程中需要考虑的一个非常重要的问题。因为高隔离级别会导致更多的锁定,而低隔离级别可能会影响计算。 – danihp

+0

我并不是说交易本身并不重要,只是通常你不会看到这种不一致,因为请求是短暂的。 –