if __name__ == "__main__":
while True:
results = None
results = Decay.objects.filter(next_decay_at__lte=datetime.datetime.now())
for r in results:
print r.next_decay_at
time.sleep(10)
出于某种原因,即使我在表中更新“next_decay_at”,这个Decay.objects.filter查询似乎也会被缓存,当我打印“next_decay_at”时,它似乎没有改变!它每次都打印相同。
当我重新启动脚本时,它似乎已更改并且print语句已更改。但是当我让它再次运行时,它会一遍又一遍地打印出来。可能是while循环正在缓存结果集吗?
答案 0 :(得分:0)
了解Django的transaction handling。
答案 1 :(得分:0)
QuerySet缓存结果。引用docs:
在新创建的QuerySet中,缓存为空。第一次评估QuerySet - 并因此发生数据库查询 - Django将查询结果保存在QuerySet的缓存中并返回已明确请求的结果(例如,如果正在迭代QuerySet,则返回下一个元素)过度)。对QuerySet的后续评估将重用缓存的结果。
将您的代码更改为以下内容:
date_from = datetime.datetime.now()
for r in Decay.objects.filter(next_decay_at__lte=date_from):
print r.next_decay_at
或使用iterator方法:
results = Decay.objects.filter(next_decay_at__lte=datetime.datetime.now())
for r in results.iterator():
print r.next_decay_at
答案 2 :(得分:0)
您看到的行为与QuerySet无关。它与事务管理有关。当您的请求或脚本启动时,Django会打开一个事务,直到该事务提交或回滚,它才会在其他事务中间歇性地发生任何事情。
如果您提交事务并再次运行该代码块,则应获得更新结果。
from django.db import transaction
transaction.commit()