我在SQL数据库上有一个django模型TestModel。
每当我做
TestModel.objects.all()
如果我从同一个进程多次运行它,我似乎得到了相同的结果。我通过手动删除(不使用任何django基元)从构建模型的表中的一行来测试,查询仍然返回相同的结果,即使删除后显然应该有更少的对象。
是否存在某种缓存机制,每次我想检索对象时django都没有进入数据库?
如果有,有没有办法我仍然可以强制django在每个查询上转到数据库,最好不要编写原始SQL查询?
我还应该指定通过重新启动进程,模型再次返回正确的对象,我不再看到已删除的对象,但如果我再删除一些问题,则会再次出现问题。
答案 0 :(得分:1)
这是因为您的数据库隔离级别是可重复读取的。在django shell中,所有请求都包含在单个事务中。
<强>被修改强>
你可以试试你的shell:
from django.db import transaction
with transaction.autocommit():
t = TestModel.objects.all()
...
答案 1 :(得分:-1)
听起来像是db事务问题。如果您在单独进入数据库本身并修改数据时保持shell会话处于打开状态,那么在shell中打开的事务将不会因隔离而看到更改。在看到它们之前,您需要退出并重新加载shell以获取新事务。
请注意,在生产中,事务与请求/响应周期相关联,因此这不是一个重要问题。