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查询无法选择新对象的主要内容,如果未能解决你的问题,请参考以下文章

使用 ORM Django 过滤新更新的查询集返回空查询集

django的 ORM 操作 增加和查询

Django ORM:构造查询,该查询将在多对多字段的最后位置的对象中的字段上查找匹配项

(Django)气流中的 ORM - 有可能吗?

Django - 原始 SQL 查询或 Django QuerySet ORM

Django ORM 类似于 Pony ORM 中的选择查询