Django ORM查询无法选择新对象
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Django ORM查询无法选择新对象相关的知识,希望对你有一定的参考价值。
建立:
- Python脚本A每15分钟将数据插入数据库
- Python脚本B每隔几分钟查询最后5个条目
两者都使用django的ORM,相同的mysql DB和相同的DB用户帐户(相同的settings.py
文件)
问题: B只能获取在运行之前插入的条目。好像B正在使用冻结的DB运行,在B首次连接到DB时冻结。
怎么会? 我可以在django中控制这种行为吗?
答案
如果您正在重用相同的Manager对象,则必须记住it's caching。要解决这个问题,你必须手动更新。
这将在每次迭代中返回相同的结果:
while True:
same_every_time = AClass.objects.all().order_by('-id')[:5]
sleep(300)
为了使其正常工作,您必须添加更新:
while True:
AClass.objects.update()
updated_results = AClass.objects.all().order_by('-id')[:5]
sleep(300)
另一答案
Django本身使用了一种容器管理的持久性。这意味着数据库事务在上游响应级联期间由中间件提交。
如果您自己使用Django ORM,则应确保实际提交事务:
from django.db import transaction
def my_task(whatever):
MyModel.objects.create(...)
# do whatever
transaction.commit()
return 'my_result'
另一答案
我在尝试使用Django测试解决类似情况时发现了这个stackoverflow问题:在测试中,我修改了Django模型对象,但是更改没有反映在数据库中,因此第二个线程中的数据库读取器可以检测到更改。解决方案是从TransactionTestCase继承我的测试类,而不是默认的django.test.TestCase。
以上是关于Django ORM查询无法选择新对象的主要内容,如果未能解决你的问题,请参考以下文章
Django ORM:构造查询,该查询将在多对多字段的最后位置的对象中的字段上查找匹配项