7

我有一个基于 SQL 数据库的 django 模型 TestModel。

每当我这样做

TestModel.objects.all()

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

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

如果有的话,有没有办法我仍然可以强制 django 在每个查询中访问数据库,最好不编写原始 SQL 查询?

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

4

2 回答 2

1

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

已编辑

你可以在你的shell中尝试:

from django.db import transaction
with transaction.autocommit():
    t = TestModel.objects.all()
    ...
于 2012-12-07T17:12:53.823 回答
-1

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

请注意,在生产中,事务与请求/响应周期相关联,因此这不是一个重大问题。

于 2012-12-07T17:17:36.723 回答